Java 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

我有一个带有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);
}
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]