我在下面编写代码来从Arraylist中获取重复元素。我的aerospikePID列表没有任何重复值,但是当我执行下面的代码时,它正在读取条件。
ArrayList<Integer> aerospikePIDs = new ArrayList<Integer>();
ArrayList<Integer> duplicates = new ArrayList<Integer>();
boolean flag;
for(int j=0;j<aerospikePIDs.size();j++) {
for(int k=1;k<aerospikePIDs.size();k++) {
if(aerospikePIDs.get(j)==aerospikePIDs.get(k)) {
duplicates.add(aerospikePIDs.get(k));
flag=true;
}
if(flag=true)
System.out.println("duplicate elements for term " +searchTerm+duplicates);
}
}
答案 0 :(得分:2)
你的内循环应该从j + 1
(而不是1
)开始,否则当j = 1
(j的第二次迭代),k = 1
时(k的第一次迭代) j值等于1)。
aerospikePIDs.get(j)==aerospikePIDs.get(k)
返回true
。
所以代码应该是:
ArrayList<Integer> aerospikePIDs = new ArrayList<Integer>();
ArrayList<Integer> duplicates = new ArrayList<Integer>();
for (int j = 0; j < aerospikePIDs.size(); j++) {
for (int k = j + 1; k < aerospikePIDs.size(); k++) {
if (aerospikePIDs.get(j)==aerospikePIDs.get(k)) {
duplicates.add(aerospikePIDs.get(k));
System.out.println("duplicate elements for term " +searchTerm+duplicates);
}
}
}
注意:标记不是必需的,因为如果你添加了一个副本,你可以直接在if中打印它,而无需定义新的不必要的变量和代码。
答案 1 :(得分:0)
使用更高级别的抽象:
Map<Integer, Integer>
- 键是PID列表中的条目,值是计数器。相应的循环只是检查&#34;键存在?是 - 增加柜台;否则,使用计数器1和#34;添加密钥。问题/答案向您展示了做这些事情的好方法......几乎每天都会发布在这里。例如,你可以开始here;你只需要适应&#34; String&#34;关键是&#34;整数&#34;键。
真的:在使用集合时,您的第一步始终是:找到最高级完成任务的方式 - 而不是坐下来编写像您这样容易出错的低级代码那样。
答案 2 :(得分:0)
您正在使用相同的arraylist进行迭代。您正在检查内部for循环中的每个数据,确保它将显示重复项。