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

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

有什么想法吗?


当前回答

这样地:

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(例如…)

其他回答

Varargs也会起作用!

Stream.of(T... values).collect(Collectors.toSet());
private Map<Integer, Set<Integer>> nobreaks = new HashMap();
nobreaks.put(1, new HashSet(Arrays.asList(new int[]{2, 4, 5})));
System.out.println("expected size is 3: " +nobreaks.get(1).size());

输出为

expected size is 3: 1

将其更改为

nobreaks.put(1, new HashSet(Arrays.asList( 2, 4, 5 )));

输出为

expected size is 3: 3

new HashSet<Object>(Arrays.asList(Object[]a));

但我认为这会更有效率:

final Set s = new HashSet<Object>();    
for (Object o : a) { s.add(o); }         

对于任何解决Android问题的人:

Kotlin集合解决方案

星号*是排列运算符。它单独应用集合中的所有元素,每个元素按顺序传递给vararg方法参数。相当于:

val myArray = arrayOf("data", "foo")
val mySet = setOf(*myArray)

// Equivalent to
val mySet = setOf("data", "foo")

// Multiple spreads ["data", "foo", "bar", "data", "foo"]
val mySet = setOf(*myArray, "bar", *myArray)

不传递参数setOf()将导致空集。

除了setOf之外,您还可以对特定的哈希类型使用以下任何一种:

hashSetOf()
linkedSetOf()
mutableSetOf()
sortableSetOf()

这是如何显式定义集合项类型的。

setOf<String>()
hashSetOf<MyClass>()

在Eclipse集合中,以下功能将起作用:

Set<Integer> set1 = Sets.mutable.of(1, 2, 3, 4, 5);
Set<Integer> set2 = Sets.mutable.of(new Integer[]{1, 2, 3, 4, 5});
MutableSet<Integer> mutableSet = Sets.mutable.of(1, 2, 3, 4, 5);
ImmutableSet<Integer> immutableSet = Sets.immutable.of(1, 2, 3, 4, 5);

Set<Integer> unmodifiableSet = Sets.mutable.of(1, 2, 3, 4, 5).asUnmodifiable();
Set<Integer> synchronizedSet = Sets.mutable.of(1, 2, 3, 4, 5).asSynchronized();
ImmutableSet<Integer> immutableSet = Sets.mutable.of(1, 2, 3, 4, 5).toImmutable();

注意:我是Eclipse集合的提交人