【问题标题】:Removing duplicates from an array list of characters using a loop? [duplicate]使用循环从字符数组列表中删除重复项? [复制]
【发布时间】:2015-12-07 07:06:52
【问题描述】:
public static ArrayList<Character> removeDuplicates (ArrayList<Character> data) {
    ArrayList<Character> newList = new ArrayList<Character>();

    for (int i = 0; i < data.size() - 1; i++) {
      if (!newList.contains(data.get(i))) 
         newList.add(0,(data.get(i)));
    }
    return newList;
  }

到目前为止,这是我的代码。我不明白这是怎么回事

【问题讨论】:

  • 这是一个非常低效的实现,但它应该可以工作
  • 我认为你总是将数字添加到索引 0,所以它只会覆盖 0。只需使用 add(data.get(i)) 将其添加到列表的末尾
  • @jackie 错了,他使用的是add 而不是set
  • @Dici 感谢您的更正。我应该进一步阅读文档。 “在此列表中的指定位置插入指定元素。将当前位于该位置的元素(如果有)和任何后续元素向右移动(将其索引加一)。”
  • 问题是,“不工作”是什么意思?

标签: java loops arraylist


【解决方案1】:

您可以使用SetSetCollection,不允许重复对象。

我不确定您的 List 是什么对象类型,但假设您使用的是 String

//replace all instances of 'String' with whatever Object type you are using
Set<String> mySet = new HashSet<>();
for(String s : data){ 
  mySet.add(s);
}

那么,如果你想将数据发送到List,请执行以下操作:

ArrayList newList = new ArrayList(mySet);

【讨论】:

  • 使用集合很好,但您不需要手动填充它。你可以只做new ArrayList&lt;&gt;(new HashSet&lt;&gt;(data)),但我想这太容易解决问题了
【解决方案2】:

您的实施存在 2 个问题。

  1. 您没有计算数组中的所有项。您应该使用i &lt;= data.size() - 1i &lt; data.size()。现在你错过了最后一项。
  2. 您没有将项目添加到列表的末尾。相反,您会反复覆盖第零个(第一个)值。编辑:对不起,那是不正确的。您在列表的开头插入,这将有效,但对于最常用的列表(例如 ArrayList)效率低。

这是固定版本。问题区域用/* */注释掉。

List<Object> newList = new ArrayList<Object>();

for (int i = 0; i < data.size() /* - 1 */ ; i++) {
    if (!newList.contains(data.get(i)))
        newList.add( /* 0, */ (data.get(i)));
}

return newList;

编辑:在列表中使用 contains(...) 很慢。您可以使用Set 优化和简化此操作。集合是具有唯一值的集合。两次添加相同的值没有效果。我们可以更进一步,使用LinkedHashSet 作为实现类,它将保持与原始列表中相同的顺序。

return new ArrayList<Object>(new LinkedHashSet<Object>(data));

【讨论】:

  • 正如@Dici 指出的那样,#2 是不正确的。请参阅 javadocs:public void add(int index, E element) 在此列表中的指定位置插入指定元素。将当前位于该位置的元素(如果有)和任何后续元素向右移动(将它们的索引加一)。
  • @jackie 谢谢,你是对的。我更新了我的答案。
  • 实际上真正好的解决方案是使用Set,但我 +1 答案,因为它修复了 OP 的代码
  • @Dici 是的,你完全正确。我添加了一个使用LinkedHashSet 的改进解决方案,它也将保持原始列表排序。
猜你喜欢
  • 2021-10-24
  • 1970-01-01
  • 1970-01-01
  • 2011-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-28
  • 2022-01-20
相关资源
最近更新 更多