我想在Java中将数组转换为Set。有一些明显的方法可以做到这一点(即使用循环),但我想做一些更整洁的事情,比如:
java.util.Arrays.asList(Object[] a);
有什么想法吗?
我想在Java中将数组转换为Set。有一些明显的方法可以做到这一点(即使用循环),但我想做一些更整洁的事情,比如:
java.util.Arrays.asList(Object[] a);
有什么想法吗?
当前回答
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());
其他回答
有时使用一些标准库会有很大帮助。尝试查看Apache Commons集合。在这种情况下,您的问题简单地转化为以下内容
String[] keys = {"blah", "blahblah"}
Set<String> myEmptySet = new HashSet<String>();
CollectionUtils.addAll(pythonKeywordSet, keys);
这里是CollectionsUtils javadoc
快速:您可以做到:
// Fixed-size list
List list = Arrays.asList(array);
// Growable list
list = new LinkedList(Arrays.asList(array));
// Duplicate elements are discarded
Set set = new HashSet(Arrays.asList(array));
并反转
// Create an array containing the elements in a list
Object[] objectArray = list.toArray();
MyClass[] array = (MyClass[])list.toArray(new MyClass[list.size()]);
// Create an array containing the elements in a set
objectArray = set.toArray();
array = (MyClass[])set.toArray(new MyClass[set.size()]);
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());
我根据上面的建议写了下面的内容——偷吧……真不错!
/**
* Handy conversion to set
*/
public class SetUtil {
/**
* Convert some items to a set
* @param items items
* @param <T> works on any type
* @return a hash set of the input items
*/
public static <T> Set<T> asSet(T ... items) {
return Stream.of(items).collect(Collectors.toSet());
}
}
如果需要构建一个内部只有一个元素的不可变集合,可以使用Collections.singleton(…)
Set<String> mySet = Collections.singleton("Have a good day :-)");
这并不能回答最初的问题,但可能对某人有用(至少对我来说是这样)。如果你认为这个答案不合适,告诉我,我会删除它。