使用循环从字符数组列表中删除重复项? [复制]

Posted

技术标签:

【中文标题】使用循环从字符数组列表中删除重复项? [复制]【英文标题】: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 感谢您的更正。我应该进一步阅读文档。 “在此列表中的指定位置插入指定元素。将当前位于该位置的元素(如果有)和任何后续元素向右移动(将其索引加一)。” 问题是,“不工作”是什么意思? 【参考方案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 个问题。

    您没有计算数组中的所有项。您应该使用i &lt;= data.size() - 1i &lt; data.size()。现在你错过了最后一项。 您没有将项目添加到列表的末尾。相反,您会反复覆盖第零个(第一个)值。编辑:对不起,那是不正确的。您在列表的开头插入,这将有效,但对于最常用的列表(例如 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 的改进解决方案,它也将保持原始列表排序。

以上是关于使用循环从字符数组列表中删除重复项? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何使用列表理解从列表中删除重复项? [复制]

jQuery - 从字符串数组中删除重复项[重复]

如何从我的列表中删除重复项? [复制]

如何通过 Oracle 中的正则表达式从逗号分隔列表中删除重复项,但我不想要重复值? [复制]

从数组中删除重复项时出现超出范围异常

从数组列表中删除重复项