5

我开发了一个数组列表。

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 是否提供将列表转换为集合的功能?是否有其他工具可以从列表中删除重复项?

4

8 回答 8

25

您可以使用以下方法转换为 Set:

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

或者,您可以使用以下命令转换为集合并返回列表:

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

然而,这两者都不太可能保持元素的顺序。为了保持顺序,您可以HashSet在迭代时使用 a 作为辅助结构:

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;

在重复的情况下,只有第一次出现在结果中。如果您只想出现最后一次出现,那将是一个更棘手的问题。我会通过反转输入列表,应用上述内容,然后反转结果来解决它。

于 2012-04-29T08:31:01.440 回答
9

这个:

Set<String> set = new HashSet<String>();
set.addAll(list);
list.clear();
list.addAll(set);
于 2012-04-29T08:27:49.093 回答
5

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

完毕 :)

于 2016-09-07T17:25:19.717 回答
3

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

Set<String> mySet = new LinkedHashSet<String>(list);
于 2014-06-06T20:18:52.110 回答
1

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

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

您将拥有一个新的项目视图,删除了重复项,但您将失去订购。到目前为止发布的每个答案都是如此。要继续排序,您应该迭代现有列表并仅在元素重复时删除元素(这可以使用集合来检查是否已找到元素)。

于 2012-04-29T08:31:33.117 回答
0

您可以首先使用一个集合或转换为它:

 Set<String> set = new TreeSet<String>(list);
于 2012-04-29T08:30:53.937 回答
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);

    }

}
于 2014-06-06T20:11:35.763 回答
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);

正常的for循环

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");
于 2019-03-28T05:05:44.933 回答