加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 从ArrayList中删除重复值

发布时间:2020-12-15 07:35:50 所属栏目:Java 来源:网络整理
导读:我有一个字符串的Arraylist,我在其中添加了一些重复值.我只是想删除重复值,所以如何删除它. 这里的例子我有一个想法. ListString list = new ArrayListString(); list.add("Krishna"); list.add("Krishna"); list.add("Kishan"); list.add("Krishn"); list.a
我有一个字符串的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或其他方式,但只使用数组列表.
我想对此有你的建议.谢谢你提前回答.

解决方法

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

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

任何涉及List#contains或List#remove的方法都可能会减少从O(n)(如上例所示)到O(n ^ 2)的渐近运行时间.

编辑对于注释中提到的要求:如果要删除重复元素,但将字符串视为忽略大小写,则可以执行以下操作:

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)的运行时间,这仍然比许多其他选项更好.请注意,这看起来比它可能要复杂得多:我假设列表中元素的顺序可能不会改变.如果列表中元素的顺序无关紧要,您可以这样做

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读