为了账号安全,请及时绑定邮箱和手机立即绑定

Java:检测ArrayList中的重复项?

/ 猿问

Java:检测ArrayList中的重复项?

BIG阳 2019-09-02 10:57:33

我怎样才能检测(返回true / false)ArrayList是否包含Java中的多个相同元素?

非常感谢,特里

编辑 忘了提到我不打算将“块”相互比较,但是它们的整数值。每个“块”都有一个int,这就是它们的不同之处。我通过调用名为“getNum”的方法找到特定块的int(例如table1 [0] [2] .getNum();


查看完整描述

3 回答

?
慕斯卡3215842

最简单:将整个集合转储到Set中(使用Set(Collection)构造函数或Set.addAll),然后查看Set是否与ArrayList具有相同的大小。


List<Integer> list = ...;

Set<Integer> set = new HashSet<Integer>(list);


if(set.size() < list.size()){

    /* There are duplicates */

}

更新:如果我正确理解你的问题,你有一个2d的Block数组,如


阻止表[] [];


并且你想检测它们中的任何一行是否有重复?


在这种情况下,假设Block正确实现“equals”和“hashCode”,我可以执行以下操作:


for (Block[] row : table) {

   Set set = new HashSet<Block>(); 

   for (Block cell : row) {

      set.add(cell);

   }

   if (set.size() < 6) { //has duplicate

   }

}

我对语法并不是100%肯定,因此将其编写为更安全


for (int i = 0; i < 6; i++) {

   Set set = new HashSet<Block>(); 

   for (int j = 0; j < 6; j++)

    set.add(table[i][j]);

 ...

Set.add如果正在添加的项目已经在集合中,则返回布尔值false,因此false如果您想知道的是否有任何重复,您甚至可以短路并打包任何返回的添加。


查看完整回答
反对 回复 2019-09-02
?
Qyouu

改进了代码,使用返回值Set#add而不是比较列表和集合的大小。


public static <T> boolean hasDuplicate(Iterable<T> all) {

    Set<T> set = new HashSet<T>();

    // Set#add returns false if the set does not change, which

    // indicates that a duplicate element has been added.

    for (T each: all) if (!set.add(each)) return true;

    return false;

}


查看完整回答
反对 回复 2019-09-02
?
MMMHUHU

改进了返回重复元素的代码


可以在Collection中找到重复项

返回重复的集合

可以从Set中获取唯一元素

public static <T> List getDuplicate(Collection<T> list) {


    final List<T> duplicatedObjects = new ArrayList<T>();

    Set<T> set = new HashSet<T>() {

    @Override

    public boolean add(T e) {

        if (contains(e)) {

            duplicatedObjects.add(e);

        }

        return super.add(e);

    }

    };

   for (T t : list) {

        set.add(t);

    }

    return duplicatedObjects;

}



public static <T> boolean hasDuplicate(Collection<T> list) {

    if (getDuplicate(list).isEmpty())

        return false;

    return true;

}


查看完整回答
反对 回复 2019-09-02

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信