ArrayList重复删除

时间:2016-03-21 21:50:29

标签: 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 < 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()是一种将日期字符串转换为格里历日历的方法。

当我使用此代码时,它会删除大部分重复项,但每次循环时仍然会有一些重复项。我也试过它而没有比较日期和仍然相同的问题。有人可以帮忙吗?

感谢您的帮助!

3 个答案:

答案 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的元素。