使用循环从字符数组列表中删除重复项? [复制]
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】:
您可以使用Set
。 Set
是 Collection
,不允许重复对象。
我不确定您的 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<>(new HashSet<>(data))
,但我想这太容易解决问题了【参考方案2】:
您的实施存在 2 个问题。
-
您没有计算数组中的所有项。您应该使用
i <= data.size() - 1
或i < 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
的改进解决方案,它也将保持原始列表排序。以上是关于使用循环从字符数组列表中删除重复项? [复制]的主要内容,如果未能解决你的问题,请参考以下文章