从列表中删除重复的元素

时间:2012-04-29 08:25:07

标签: java list duplicates

我开发了一个数组列表。

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

list.add("1");
list.add("2");
list.add("3");
list.add("3");
list.add("5");
list.add("6");
list.add("7");
list.add("7");
list.add("1");
list.add("10");
list.add("2");
list.add("12");

但如上所述,它包含许多重复元素。我想删除该列表中的所有重复项。为此我想首先我需要将列表转换为集合。

Java是否提供将列表转换为集合的功能?是否还有其他设施可以从列表中删除重复项?

8 个答案:

答案 0 :(得分:24)

您可以转换为套装:

Set<String> aSet = new HashSet<String>(list);

或者您可以转换为一个集合并返回到列表:

list = new ArrayList<String>(new HashSet<String>(list));
但是,这两者都不太可能保留元素的顺序。为了保留顺序,您可以在迭代时使用HashSet作为辅助结构:

List<String> list2 = new ArrayList<String>();
HashSet<String> lookup = new HashSet<String>();
for (String item : list) {
    if (lookup.add(item)) {
        // Set.add returns false if item is already in the set
        list2.add(item);
    }
}
list = list2;

如果是重复项,结果中只会出现第一个匹配项。如果您只想出现最后一次出现,那就更难了。我将通过反转输入列表,应用上述内容,然后反转结果来解决它。

答案 1 :(得分:9)

此:

Set<String> set = new HashSet<String>();
set.addAll(list);
list.clear();
list.addAll(set);

答案 2 :(得分:5)

Java 8 方式: list.stream().distinct().collect(Collectors.toList());

完成:))

答案 3 :(得分:3)

如果您需要保留元素顺序,请使用LinkedHashSet而不是HashSet

Set<String> mySet = new LinkedHashSet<String>(list);

答案 4 :(得分:1)

只需使用普通的构造函数:

ArrayList<T> yourList;
HashSet<T> set = new HashSet<T>(yourList);

您将获得项目的新视图,删除重复项,但您将失去订购。到目前为止发布的每个答案都是如此。为了保持排序,你应该迭代现有的列表并删除一个元素,如果它是重复的(可以使用一个集来检查是否已找到一个元素)。

答案 5 :(得分:0)

您可以首先使用一组或转换为它:

 Set<String> set = new TreeSet<String>(list);

答案 6 :(得分:0)

package com.scjp.dump.test;

import java.util.ArrayList;

import java.util.Iterator;

import java.util.List;

public class ArrayListTest {

    public static void main(String[] args) {

        List<Integer> mylist2 = new ArrayList<Integer>();

        List<Integer> mylist1 = new ArrayList<Integer>();
        mylist1.add(3);
        mylist1.add(3);
        mylist1.add(5);
        mylist1.add(9);
        mylist1.add(2);
        mylist1.add(5);
        mylist1.add(5);
        mylist1.add(3);
        mylist1.add(3);
        mylist1.add(3);
        mylist1.add(9);
        mylist1.add(56);
        System.out.println(mylist1);
        Iterator<Integer> itr1 = mylist1.listIterator();
        while (itr1.hasNext()) {
            Integer itn1 = (Integer) itr1.next();
            if (mylist2.contains(itn1) == false)
                mylist2.add(itn1);
        }

        System.out.println(mylist2);

    }

}

答案 7 :(得分:0)

这里有一些方法可以实现这一目标。

使用Java 8

List<String> distinctLambda=originalList.stream()
           .distinct().collect(Collectors.toList());
 System.out.println(distinctLambda);

使用设置

Set<String> distinctSet=new HashSet<>(originalList);
        System.out.println(distinctSet);

正常循环

List<String> distinctNewList=new ArrayList<>();
        for (String temp:originalList) {
            if(distinctNewList.size()==0){
                distinctNewList.add(temp);
                continue;
            }

            if(!distinctNewList.contains(temp)){
                distinctNewList.add(temp);
            }
        }

        System.out.println(distinctNewList);

这是您的数据集:

ArrayList<String> originalList = new ArrayList<>();
        originalList.add("1");
        originalList.add("2");
        originalList.add("3");
        originalList.add("3");
        originalList.add("5");
        originalList.add("6");
        originalList.add("7");
        originalList.add("7");
        originalList.add("1");
        originalList.add("10");
        originalList.add("2");
        originalList.add("12");