我想在Java中将数组转换为Set。有一些明显的方法可以做到这一点(即使用循环),但我想做一些更整洁的事情,比如:

java.util.Arrays.asList(Object[] a);

有什么想法吗?


当前回答

使用Guava,您可以做到:

T[] array = ...
Set<T> set = Sets.newHashSet(array);

其他回答

使用stanford-stagger-3.0.jar中的CollectionUtils或ArrayUtils

import static edu.stanford.nlp.util.ArrayUtils.asSet;
or 
import static edu.stanford.nlp.util.CollectionUtils.asSet;

  ...
String [] array = {"1", "q"};
Set<String> trackIds = asSet(array);
Set<T> mySet = new HashSet<T>();
Collections.addAll(mySet, myArray);

这是JDK6中的Collections.addAll(java.util.Collection,T…)。

另外:如果我们的数组中充满了原语呢?

对于JDK<8,我只需编写一个明显的For循环,一次完成包装和添加到set。

对于JDK>=8,一个有吸引力的选项是:

Arrays.stream(intArray).boxed().collect(Collectors.toSet());

在Java 10中:

String[] strs = {"A", "B"};
Set<String> set = Set.copyOf(Arrays.asList(strs));

Set.copyOf返回包含给定集合元素的不可修改集合。

给定的集合不能为null,并且不能包含任何null元素。

这样地:

Set<T> mySet = new HashSet<>(Arrays.asList(someArray));

在Java 9+中,如果不可修改集合正常:

Set<T> mySet = Set.of(someArray);

在Java 10+中,可以从数组组件类型推断出泛型类型参数:

var mySet = Set.of(someArray);

小心

Set.of抛出IllegalArgumentException-如果有任何重复someArray中的元素。查看更多详细信息:https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Set.html#of(例如…)

如果需要构建一个内部只有一个元素的不可变集合,可以使用Collections.singleton(…)

Set<String> mySet = Collections.singleton("Have a good day :-)");

这并不能回答最初的问题,但可能对某人有用(至少对我来说是这样)。如果你认为这个答案不合适,告诉我,我会删除它。