Java:在 ArrayList 中检测重复项?

2022-08-31 09:02:54

我如何检测(返回true/false)ArrayList是否在Java中包含多个相同的元素?

非常感谢,特里

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


答案 1

最简单的方法:将整个集合转储到 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


答案 2

改进了代码,使用返回值代替比较列表和集的大小。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;
}