我开发了一个数组列表。
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是否提供将列表转换为集合的功能?是否还有其他设施可以从列表中删除重复项?
答案 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");