我想在Java中将数组转换为Set。有一些明显的方法可以做到这一点(即使用循环),但我想做一些更整洁的事情,比如:
java.util.Arrays.asList(Object[] a);
有什么想法吗?
我想在Java中将数组转换为Set。有一些明显的方法可以做到这一点(即使用循环),但我想做一些更整洁的事情,比如:
java.util.Arrays.asList(Object[] a);
有什么想法吗?
当前回答
在Java 10中:
String[] strs = {"A", "B"};
Set<String> set = Set.copyOf(Arrays.asList(strs));
Set.copyOf返回包含给定集合元素的不可修改集合。
给定的集合不能为null,并且不能包含任何null元素。
其他回答
new HashSet<Object>(Arrays.asList(Object[]a));
但我认为这会更有效率:
final Set s = new HashSet<Object>();
for (Object o : a) { s.add(o); }
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());
如果需要构建一个内部只有一个元素的不可变集合,可以使用Collections.singleton(…)
Set<String> mySet = Collections.singleton("Have a good day :-)");
这并不能回答最初的问题,但可能对某人有用(至少对我来说是这样)。如果你认为这个答案不合适,告诉我,我会删除它。
已经有很多很好的答案了,但大多数答案都不适用于基元数组(如int[]、long[]、char[]、byte[]等)
在Java 8及更高版本中,您可以使用以下命令对阵列进行装箱:
Integer[] boxedArr = Arrays.stream(arr).boxed().toArray(Integer[]::new);
然后使用流转换为集合:
Stream.of(boxedArr).collect(Collectors.toSet());
使用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);