我想在Java中将数组转换为Set。有一些明显的方法可以做到这一点(即使用循环),但我想做一些更整洁的事情,比如:
java.util.Arrays.asList(Object[] a);
有什么想法吗?
我想在Java中将数组转换为Set。有一些明显的方法可以做到这一点(即使用循环),但我想做一些更整洁的事情,比如:
java.util.Arrays.asList(Object[] a);
有什么想法吗?
当前回答
使用Guava,您可以做到:
T[] array = ...
Set<T> set = Sets.newHashSet(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());
使用Guava,您可以做到:
T[] array = ...
Set<T> set = Sets.newHashSet(array);
在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集合的提交人
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); }