Java ArrayList重复项删除
我有一个带有ping的Arraylist,这些是链接到名称的日期,我想删除名称的所有重复项并保留名称的最近日期 代码Java ArrayList重复项删除,java,date,arraylist,duplicates,Java,Date,Arraylist,Duplicates,我有一个带有ping的Arraylist,这些是链接到名称的日期,我想删除名称的所有重复项并保留名称的最近日期 代码 private ArrayList <String> deleteDuplicates() { ArrayList <Ping> tempPings = new ArrayList < Ping > (); tempPings.addAll(jaws.pastMonth()); for (int i = 0; i < temp
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);
}
private ArrayList deleteDuplicates(){
ArrayList tempPings=新建ArrayList();
tempPings.addAll(jaws.passmonth());
对于(int i=0;i
changePingToDate()是一种将日期字符串转换为公历的方法
当我使用这段代码时,它会删除大部分重复的代码,但每次循环中仍有一些剩余的代码。我也试过了,没有比较日期,还是一样的问题。有人能帮忙吗
谢谢你的帮助 在列表中循环时,不要从列表中删除元素。因此,将所有要删除的项目添加到另一个列表中,并在最后从
tempings
中删除所有项目
private ArrayList <String> deleteDuplicates() {
ArrayList <Ping> tempPings = new ArrayList < Ping > ();
tempPings.addAll(jaws.pastMonth());
ArrayList <Ping> pingsToRemove = new ArrayList <Ping> ();
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))) {
pingsToRemove.add(tempPings.get(j));
}
}
}
}
tempPings.removeAll(pingsToRemove);
return pingToNames(tempPings);
}
private ArrayList deleteDuplicates(){
ArrayList tempPings=新建ArrayList();
tempPings.addAll(jaws.passmonth());
ArrayList pingsToRemove=新的ArrayList();
对于(int i=0;i
因为您在理解您正在执行的remove()
操作导致问题的原因时遇到问题。我会尽力解释的
这是一个概括性的解释,旨在对代码中的问题给出一个想法
我有一桶10样东西。在每次迭代中,我都进行检查,以确保我一直检查到bucket.size()
。如果我在I
删除一个项目,则I+1
处的项目将取而代之。删除过程确保bucket.size()现在等于9,而不是10。循环将我的i
增加1。跳过位于i+1
且现在位于i
的元素
ArrayList<String> values = new ArrayLiist<>(Arrays.asList(
"apple",
"banana",
"grape",
"banana",
"apple",
"banana",
"apple",
"grape"
));
只有Java7吗
values = new ArrayList<>(new LinkedHashSet<>(values));
然后,像往常一样在列表上循环执行约会操作 @aribeiro嗨,我已经检查了答案,但这对我的问题没有帮助,我的.equals似乎工作正常,名称完全相同,例如“Mary Lee”多次,它似乎选择了要删除的名称。您正在调用
.remove()
,这会修改列表的大小以及在循环时查看的索引。您正在跳过值。请使用迭代器。我不想在这里添加另一个答案。SO和Google上都有大量可用的资源。@cricket_007好的,谢谢,我不完全确定我是否理解,如果它删除了我正在比较的值之后的值,为什么会更改我正在查看的值的索引?你对如何解决这个问题有什么想法吗?谢谢。或者将所有值转储到集合中以删除重复项。您可以使用迭代器。删除我用这种方法尝试过,结果在我400多个大小的数组中,有9060个元素要删除,根本不确定为什么会发生这种情况,如果我使用迭代器,是否需要使用两个?我从未见过使用迭代器来迭代已经检查过的元素(在for j=I+1的情况下),这是可能的吗?谢谢。尝试在pingsToRemove.add(tempPings.get(j))之前添加if语句
检查是否已经添加了tempings.get(j)
。类似于if(!pingsToRemove.contains(tempPings.get(j))
。这仍然包含由(int j=i+1;j引起的关闭问题{
。如果列表大小为10,则内部循环将在j<9
时循环,任何时候都不会将任何项与j=9
项进行比较。您的第一个循环可能是为(int i=0;i{
,这里的-1
是可以的,因为你在j=i+1
开始你的第二个循环,但是在第二个循环的循环条件下它是不可以的。这样做更有意义,非常感谢你!@B.KLewis,并演示使用迭代器来完成这件事情的好方法。这将非常有用,不幸的是我们我必须比较日期,并给ping留下唯一的名称和最接近的时间。不过,谢谢,我认为这在将来非常方便!删除重复项后,只需在列表上循环即可。@cricket\u 007流与LinkedHashSet的第二种方式相比有什么优势?我想说流更具内存效率哈希集创建2个中间数据集合
values = new ArrayList<>(new LinkedHashSet<>(values));
[apple, banana, grape]