Java:在 ArrayList 中检测重复项?
2022-08-31 09:02:54
我如何检测(返回true/false)ArrayList是否在Java中包含多个相同的元素?
非常感谢,特里
编辑忘了提一下,我不想相互比较“块”,而是它们的整数值。每个“块”都有一个int,这就是它们的不同之处。我通过调用一个名为“getNum”的方法找到特定块的int(例如table1[0][2].getNum();
我如何检测(返回true/false)ArrayList是否在Java中包含多个相同的元素?
非常感谢,特里
编辑忘了提一下,我不想相互比较“块”,而是它们的整数值。每个“块”都有一个int,这就是它们的不同之处。我通过调用一个名为“getNum”的方法找到特定块的int(例如table1[0][2].getNum();
最简单的方法:将整个集合转储到 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
改进了代码,使用返回值代替比较列表和集的大小。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;
}