我想在Java中将数组转换为Set。有一些明显的方法可以做到这一点(即使用循环),但我想做一些更整洁的事情,比如:
java.util.Arrays.asList(Object[] a);
有什么想法吗?
我想在Java中将数组转换为Set。有一些明显的方法可以做到这一点(即使用循环),但我想做一些更整洁的事情,比如:
java.util.Arrays.asList(Object[] a);
有什么想法吗?
当前回答
有时使用一些标准库会有很大帮助。尝试查看Apache Commons集合。在这种情况下,您的问题简单地转化为以下内容
String[] keys = {"blah", "blahblah"}
Set<String> myEmptySet = new HashSet<String>();
CollectionUtils.addAll(pythonKeywordSet, keys);
这里是CollectionsUtils javadoc
其他回答
Java 8
我们也可以选择使用Stream。我们可以通过各种方式获取流:
Set<String> set = Stream.of("A", "B", "C", "D").collect(Collectors.toCollection(HashSet::new));
System.out.println(set);
String[] stringArray = {"A", "B", "C", "D"};
Set<String> strSet1 = Arrays.stream(stringArray).collect(Collectors.toSet());
System.out.println(strSet1);
// if you need HashSet then use below option.
Set<String> strSet2 = Arrays.stream(stringArray).collect(Collectors.toCollection(HashSet::new));
System.out.println(strSet2);
Collectors.toSet()的源代码显示元素是一个接一个添加到HashSet中的,但规范并不保证它是HashSet。
“对类型、可变性、可序列化性或返回Set的线程安全性。"
所以最好使用后面的选项。输出为:[A、B、C、D][A、B、C、D][A、B、C、D]
不可变集(Java 9)
Java9引入了Set.of静态工厂方法,它为提供的元素或数组返回不可变的集合。
@SafeVarargs
static <E> Set<E> of(E... elements)
有关详细信息,请检查不可变设置静态工厂方法。
不可变集(Java 10)
我们还可以通过两种方式获得不可变集合:
Set.copyOf(Arrays.asList(array))Arrays.stream(array).collector(Collectors.toUnmodifiebleList());
Collectors.toUnmodifiebleList()方法在内部使用了Java9中引入的Set.of。还要查看我的答案以了解更多信息。
快速:您可以做到:
// 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()]);
使用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> b = new HashSet<>(Arrays.asList(requiredArray));
Varargs也会起作用!
Stream.of(T... values).collect(Collectors.toSet());