在Java中将List
转换为Set
的最简单方法是什么?
答案 0 :(得分:987)
Set<Foo> foo = new HashSet<Foo>(myList);
答案 1 :(得分:134)
我同意sepp2k,但还有其他一些细节可能很重要:
new HashSet<Foo>(myList);
会给你一个没有重复的未排序集。在这种情况下,使用对象上的.equals()方法识别复制。这与.hashCode()方法结合使用。 (有关平等的更多信息,请查看here)
提供有序集的替代方法是:
new TreeSet<Foo>(myList);
如果Foo实现了Comparable,这是有效的。如果没有,那么你可能想要使用比较器:
Set<Foo> lSet = new TreeSet<Foo>(someComparator);
lSet.addAll(myList);
这取决于compareTo()(来自可比较的接口)或compare()(来自比较器)以确保唯一性。因此,如果您只关心唯一性,请使用HashSet。如果您在排序后,请考虑TreeSet。 (请记住:稍后进行优化!)如果时间效率很重要,如果空间效率很重要,请使用HashSet,请查看TreeSet。请注意,通过Trove(和其他位置)可以更有效地实现Set和Map。
答案 2 :(得分:66)
答案 3 :(得分:24)
使用java 8可以使用stream:
List<Integer> mylist = Arrays.asList(100, 101, 102);
Set<Integer> myset = mylist.stream().collect(Collectors.toSet()));
答案 4 :(得分:16)
Set<E> alphaSet = new HashSet<E>(<your List>);
或完整示例
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class ListToSet
{
public static void main(String[] args)
{
List<String> alphaList = new ArrayList<String>();
alphaList.add("A");
alphaList.add("B");
alphaList.add("C");
alphaList.add("A");
alphaList.add("B");
System.out.println("List values .....");
for (String alpha : alphaList)
{
System.out.println(alpha);
}
Set<String> alphaSet = new HashSet<String>(alphaList);
System.out.println("\nSet values .....");
for (String alpha : alphaSet)
{
System.out.println(alpha);
}
}
}
答案 5 :(得分:9)
我会在转换为set之前执行Null检查。
if(myList != null){
Set<Foo> foo = new HashSet<Foo>(myList);
}
答案 6 :(得分:6)
您可以将List<>
转换为Set<>
Set<T> set=new HashSet<T>();
//Added dependency -> If list is null then it will throw NullPointerExcetion.
Set<T> set;
if(list != null){
set = new HashSet<T>(list);
}
答案 7 :(得分:6)
对于Java 8,它非常简单:
List < UserEntity > vList= new ArrayList<>();
vList= service(...);
Set<UserEntity> vSet= vList.stream().collect(Collectors.toSet());
答案 8 :(得分:5)
让我们不要忘记我们相对较新的朋友java-8流API。 如果您需要在将列表转换为集合之前对其进行预处理,那么最好有以下内容:
list.stream().<here goes some preprocessing>.collect(Collectors.toSet());
答案 9 :(得分:3)
有多种方法可以将Set
作为:
List<Integer> sourceList = new ArrayList();
sourceList.add(1);
sourceList.add(2);
sourceList.add(3);
sourceList.add(4);
// Using Core Java
Set<Integer> set1 = new HashSet<>(sourceList); //needs null-check if sourceList can be null.
// Java 8
Set<Integer> set2 = sourceList.stream().collect(Collectors.toSet());
Set<Integer> set3 = sourceList.stream().collect(Collectors.toCollection(HashSet::new));
//Guava
Set<Integer> set4 = Sets.newHashSet(sourceList);
// Apache commons
Set<Integer> set5 = new HashSet<>(4);
CollectionUtils.addAll(set5, sourceList);
当我们使用Collectors.toSet()
时,它会根据文档There are no guarantees on the type, mutability, serializability, or thread-safety of the Set returned
返回一个集合。如果我们想获得HashSet
,那么我们可以使用其他替代方法来获取集合(检查set3
)。
答案 10 :(得分:3)
使用Java 10,您现在可以使用Set#copyOf
轻松将List<E>
转换为不可修改的Set<E>
:
示例:
var set = Set.copyOf(list);
请注意,这是一项无序操作,null
元素不允许,因为它会抛出NullPointerException
。
如果您希望它可以修改,那么只需将其传递给构造函数Set
实现。
答案 11 :(得分:3)
Java - addAll
set.addAll(aList);
Java -新对象
new HashSet(list)
Java-8
list.stream().collect(Collectors.toSet());
使用Guva
Sets.newHashSet(list)
Apache Commons
CollectionUtils.addAll(targetSet, sourceList);
答案 12 :(得分:2)
具有Optional.ofNullable
Set<Foo> mySet = Optional.ofNullable(myList).map(HashSet::new).orElse(null);
答案 13 :(得分:2)
使用构造函数的最佳方法
Set s= new HashSet(list);
在Java 8中,您还可以使用流api ::
Set s= list.stream().collect(Collectors.toSet());
答案 14 :(得分:1)
如果您使用Eclipse Collections:
MutableSet<Integer> mSet = Lists.mutable.with(1, 2, 3).toSet();
MutableIntSet mIntSet = IntLists.mutable.with(1, 2, 3).toSet();
MutableSet
接口扩展了java.util.Set
,而MutableIntSet
接口则没有。您还可以使用Iterable
工厂类将任何Set
转换为Sets
。
Set<Integer> set = Sets.mutable.withAll(List.of(1, 2, 3));
Eclipse集合here中提供了关于可变工厂的更多解释。
如果您想从ImmutableSet
中获得List
,则可以如下使用Sets
工厂:
ImmutableSet<Integer> immutableSet = Sets.immutable.withAll(List.of(1, 2, 3))
注意:我是Eclipse Collections的提交者
答案 15 :(得分:1)
请记住,从List转换为Set将删除集合中的重复项,因为List支持重复项,但是Set不支持Java中的重复项。
直接转换::将列表转换为集合的最常见,最简单的方法
// Creating a list of strings
List<String> list = Arrays.asList("One", "Two", "Three", "Four");
// Converting a list to set
Set<String> set = new HashSet<>(list);
Apache Commons Collections::您还可以使用Commons Collections API将列表转换为Set:-
// Creating a list of strings
List<String> list = Arrays.asList("One", "Two", "Three", "Four");
// Creating a set with the same number of members in the list
Set<String> set = new HashSet<>(4);
// Adds all of the elements in the list to the target set
CollectionUtils.addAll(set, list);
使用流:另一种方法是将给定列表转换为流,然后将流转换为设置:-
// Creating a list of strings
List<String> list = Arrays.asList("One", "Two", "Three", "Four");
// Converting to set using stream
Set<String> set = list.stream().collect(Collectors.toSet());