java - 从 ArrayList 中删除重复值

标签 java list sorting arraylist

我有一个字符串数组列表,并在其中添加了一些重复值。我只想删除那个重复值那么如何删除它。

这里的例子我有一个想法。

List<String> list = new ArrayList<String>();
        list.add("Krishna");
        list.add("Krishna");
        list.add("Kishan");
        list.add("Krishn");
        list.add("Aryan");
        list.add("Harm");

        System.out.println("List"+list);

        for (int i = 1; i < list.size(); i++) {
            String a1 = list.get(i);
            String a2 = list.get(i-1);
            if (a1.equals(a2)) {
                list.remove(a1);
            }
        }

        System.out.println("List after short"+list);

但是有没有足够的方法删除重复的表单列表。不使用 For 循环? 而且我可以通过使用 HashSet 或其他方式来做到这一点,但只使用数组列表。 想听听你的建议。提前感谢您的回答。

最佳答案

您可以从列表中创建一个 LinkedHashSetLinkedHashSet 将只包含每个元素一次,并且与 List 的顺序相同。然后从这个 LinkedHashSet 创建一个新的 List。如此有效,它是单行的:

list = new ArrayList<String>(new LinkedHashSet<String>(list))

任何涉及 List#containsList#remove 的方法都可能将渐近运行时间从 O(n)(如上例)减少到 O( n^2)。


EDIT 对于评论中提到的要求:如果您想删除重复元素,但考虑字符串为 equal 忽略大小写,那么您可以执行类似的操作这个:

Set<String> toRetain = new TreeSet<String>(String.CASE_INSENSITIVE_ORDER);
toRetain.addAll(list);
Set<String> set = new LinkedHashSet<String>(list);
set.retainAll(new LinkedHashSet<String>(toRetain));
list = new ArrayList<String>(set);

它将有 O(n*logn) 的运行时间,这仍然比许多其他选项要好。请注意,这看起来比实际情况要复杂一些:我假设列表中元素的 order 可能不会更改。如果列表中元素的顺序无关紧要,您可以简单地做

Set<String> set = new TreeSet<String>(String.CASE_INSENSITIVE_ORDER);
set.addAll(list);
list = new ArrayList<String>(set);

关于java - 从 ArrayList 中删除重复值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21985397/

相关文章:

java - 使用 Maven Postman 插件运行测试后无法发送电子邮件

java - 使用 Java3D 加载 .obj 文件并在 JOGL 中使用它?

java - 将文本文件加载到列表时出现内存不足错误,即使我指定了足够大的 xmx

c++ - 具有 protected 成员的自定义对象的排序 vector

mongodb - Mongodb聚合框架,排序然后分组不起作用

java - Jsoup连接(): bypass google captcha

java - 从 jsp/jSTL MVC 应用程序访问 java <List>

python - 具有固定元素的交错列表

c# - 检查如果类型是列表返回 false

c - 如何在 C 中对 dirent 进行 qsort