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

15 浏览
0 Comments

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

以下是我到目前为止的代码。我不明白为什么它不起作用。

0
0 Comments

问题:使用循环从字符数组列表中删除重复项的原因是什么?解决方法是什么?

问题的原因是:

1. 在实现中有两个问题。第一个问题是没有计算数组中的所有项。应该使用i <= data.size() - 1i < data.size()。目前你遗漏了最后一项。

2. 你没有将项添加到列表的末尾。相反,你重复地覆盖了第一个值。编辑:对不起,这是不正确的。实际上,你是在列表的开头插入,这样做可以工作,但对于最常用的列表(如ArrayList)来说是低效的。

解决方法是:

下面是修复后的版本。使用/* */注释了问题的区域。

List newList = new ArrayList();
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来优化和简化这个问题。Set是一个具有唯一值的集合。添加相同的值两次没有效果。我们可以进一步使用LinkedHashSet作为实现类,它将保持与原始列表相同的顺序。

return new ArrayList(new LinkedHashSet(data));

评论中指出,问题2是不正确的。查看javadocs:public void add(int index, E element)在列表的指定位置插入指定的元素。将当前在该位置的元素(如果有的话)和任何后续元素向右移动(将它们的索引加1)。

谢谢,你是对的。我更新了我的答案。

实际上,真正好的解决方案是使用Set,但我+1了这个答案,因为它修复了OP的代码。

是的,你绝对是对的。我添加了一个改进的解决方案,它使用LinkedHashSet,它将保持原始列表的顺序。

0
0 Comments

问题:如何使用循环从字符数组列表中删除重复项?

原因:由于数组列表可以包含重复的元素,所以可能需要从列表中删除重复的元素。这样可以确保列表中的元素都是唯一的,避免出现重复数据。

解决方法:可以使用Set集合来删除重复项。Set是一个不允许重复对象的集合。具体步骤如下:

1. 创建一个Set集合对象,用来存储不重复的元素。

2. 遍历原始的数组列表,将每个元素添加到Set集合中。

3. 将Set集合转换为ArrayList列表,以便继续使用。

下面是一个示例代码,假设原始列表中的元素类型为String:

Set mySet = new HashSet<>();
for(String s : data){ 
  mySet.add(s);
}
ArrayList newList = new ArrayList(mySet);

使用Set集合的好处是可以自动过滤掉重复的元素,确保最终的列表中只包含唯一的元素。

另外,还有一种更简洁的方式可以完成上述操作,即直接使用构造函数创建ArrayList对象,并将Set集合作为参数传入。具体代码如下:

ArrayList newList = new ArrayList(new HashSet(data));

这种方法更加简洁,但可能不够直观,不容易理解。

0