从ArrayList中删除重复值

Kri*_*hna 19 java sorting list arraylist

我有一个字符串的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);
Run Code Online (Sandbox Code Playgroud)

但是有没有足够的方法删除重复的表单列表.没有使用For循环?你可以通过使用HashSet或其他方式,但只使用数组列表.我想对此有你的建议.谢谢你提前回答.

Mar*_*o13 60

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

list = new ArrayList<String>(new LinkedHashSet<String>(list))
Run Code Online (Sandbox Code Playgroud)

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


EDIT对于在评论中提到的要求:如果你想删除重复的元素,但考虑到字符串作为平等忽略的话,那么你可以做这样的事情:

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);
Run Code Online (Sandbox Code Playgroud)

它将具有O(n*logn)的运行时间,这仍然比许多其他选项更好.请注意,这看起来比它可能要复杂得多:我假设列表中元素的顺序可能不会改变.如果列表中元素的顺序无关紧要,您可以这样做

Set<String> set = new TreeSet<String>(String.CASE_INSENSITIVE_ORDER);
set.addAll(list);
list = new ArrayList<String>(set);
Run Code Online (Sandbox Code Playgroud)


sti*_*ike 11

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

void addToList(String s){
  if(!yourList.contains(s))
       yourList.add(s);
}
Run Code Online (Sandbox Code Playgroud)

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

  • 我认为这里的重要问题是,删除是否应被视为一次性"清理"操作,或者是否可以确保每个元素仅包含一次.例如,使用您的方法插入`n`元素将具有O(n ^ 2)的运行时间... (2认同)

Shi*_*mar 9

您可以使用Google Guava实用程序,如下所示

 list = ImmutableSet.copyOf(list).asList(); 
Run Code Online (Sandbox Code Playgroud)

这可能是消除列表中重复项的最有效方法,有趣的是,它也保留了迭代顺序.

UPDATE

但是,如果您不想涉及Guava,则可以删除重复项,如下所示.

ArrayList<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);
HashSet hs = new HashSet();
hs.addAll(list);
list.clear();
list.addAll(hs);
Run Code Online (Sandbox Code Playgroud)

但是,当然,这将破坏ArrayList中元素的迭代顺序.

Shishir


Geo*_*lou 6

Java 8 流功能

您可以使用上面的distinct函数来获取列表的不同元素,

stringList.stream().distinct();
Run Code Online (Sandbox Code Playgroud)

从文档中,

返回由此流的不同元素(根据Object.equals(Object))组成的流.


另一种方法,如果你不想使用equals方法就是使用这样的collect函数,

stringList.stream()  
    .collect(Collectors.toCollection(() -> 
        new TreeSet<String>((p1, p2) -> p1.compareTo(p2)) 
));  
Run Code Online (Sandbox Code Playgroud)

从文档中,

使用收集器对此流的元素执行可变减少操作.

希望有所帮助.


小智 5

从列表中删除重复项的简单功能

private void removeDuplicates(List<?> list)
{
    int count = list.size();

    for (int i = 0; i < count; i++) 
    {
        for (int j = i + 1; j < count; j++) 
        {
            if (list.get(i).equals(list.get(j)))
            {
                list.remove(j--);
                count--;
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

示例:
输入:[1, 2, 2, 3, 1, 3, 3, 2, 3, 1, 2, 3, 3, 4, 4, 4, 1]
输出:[1, 2, 3, 4]