我有一个带有ping的Arraylist,这些是与名称相关联的日期,我想删除所有名称的副本并保留最接近的名称日期。
代码
private ArrayList <String> deleteDuplicates() {
ArrayList <Ping> tempPings = new ArrayList < Ping > ();
tempPings.addAll(jaws.pastMonth());
for (int i = 0; i < tempPings.size(); i++) {
Ping tempPing = tempPings.get(i);
for (int j = i + 1; j < tempPings.size() - 1; j++) {
Ping tempPing2 = tempPings.get(j);
if (tempPing.getName().equals(tempPing2.getName())) {
if (changePingToDate(tempPing2).before(changePingToDate(tempPing))) {
tempPings.remove(j);
}
}
}
}
return pingToNames(tempPings);
}
changePingToDate()是一种将日期字符串转换为格里历日历的方法。
当我使用此代码时,它会删除大部分重复项,但每次循环时仍然会有一些重复项。我也试过它而没有比较日期和仍然相同的问题。有人可以帮忙吗?
感谢您的帮助!
答案 0 :(得分:1)
ArrayList<String> values = new ArrayLiist<>(Arrays.asList(
"apple",
"banana",
"grape",
"banana",
"apple",
"banana",
"apple",
"grape"
));
使用Java 8?
values = values.stream().distinct().collect(Collectors.toCollection(ArrayList::new));
只有Java 7吗?
values = new ArrayList<>(new LinkedHashSet<>(values));
两者的输出是
[apple, banana, grape]
然后像往常一样循环遍历列表以执行日期操作。
答案 1 :(得分:0)
在循环内部时,不要从列表中删除元素。因此,请将要删除的所有项目添加到其他列表中,最后从123 ABC Street
中删除所有项目。
tempPings
答案 2 :(得分:0)
由于您在理解为什么remove()
操作正在导致问题时遇到问题。我会尽力解释。
这是一个通用的解释,用于了解代码中的问题。
我有一堆10件事。在每次迭代中,我都会检查以确保我检查到bucket.size()
。如果我在i
删除了某个项目,i+1
处的项目就会占据该位置。删除过程确保bucket.size()现在等于9而不是10.循环将我的i
递增1.跳过位于i+1
且现在位于i
的元素。