从数组列表中删除重复值

2022-09-02 02:06:22

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

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

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或其他方式做到这一点,但只使用数组列表。希望对此有您的建议。提前感谢您的回答。


答案 1

您可以从列表中创建一个。将仅包含每个元素一次,并且顺序与 .然后从这个创建一个新的.所以实际上,这是一句话:LinkedHashSetLinkedHashSetListListLinkedHashSet

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

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


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

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);

答案 2

如果你想只使用arraylist,那么我担心没有更好的方法可以创造巨大的性能优势。但是,通过仅使用数组列表,我会在添加到列表中之前进行检查,如下所示

void addToList(String s){
  if(!yourList.contains(s))
       yourList.add(s);
}

在这种情况下,使用 Set 是合适的。


推荐