如何在Java中将数组转换为集合

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

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

有什么想法吗?

731784 次浏览

完成Arrays.asList(array)后,您可以执行Set set = new HashSet(list);

这是一个示例方法,您可以编写:

public <T> Set<T> GetSetFromArray(T[] array) {return new HashSet<T>(Arrays.asList(array));}

像这样:

Set<T> mySet = new HashSet<>(Arrays.asList(someArray));

在Java9+中,如果不可修改的set是确定的:

Set<T> mySet = Set.of(someArray);

在Java10+中,泛型类型参数可以从数组组件类型推断出来:

var mySet = Set.of(someArray);

小心点

Set.of抛出IllegalArgumentException-如果有任何重复数组中的元素。查看更多详细信息:https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Set.html#of(E…)

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

但我认为这样会更有效:

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

番石榴你可以做:

T[] array = ...Set<T> set = Sets.newHashSet(array);
Set<T> mySet = new HashSet<T>();Collections.addAll(mySet, myArray);

这是JDK 6中的Collections.add全部(java.util.收藏,T…)

另外:如果我们的数组充满了原语怎么办?

对于JDK<8,我只需编写明显的for循环即可在一次传递中执行包装和添加到设置。

对于JDK>=8,一个有吸引力的选项是:

Arrays.stream(intArray).boxed().collect(Collectors.toSet());

快速:你可以做:

// Fixed-size listList list = Arrays.asList(array);
// Growable listlist = new LinkedList(Arrays.asList(array));
// Duplicate elements are discardedSet set = new HashSet(Arrays.asList(array));

并扭转

// Create an array containing the elements in a listObject[] objectArray = list.toArray();MyClass[] array = (MyClass[])list.toArray(new MyClass[list.size()]);
// Create an array containing the elements in a setobjectArray = set.toArray();array = (MyClass[])set.toArray(new MyClass[set.size()]);

有时使用一些标准库会有很大帮助。试着看看Apache Commons集合。在这种情况下,您的问题简单地转换为这样的东西

String[] keys = {"blah", "blahblah"}Set<String> myEmptySet = new HashSet<String>();CollectionUtils.addAll(pythonKeywordSet, keys);

这里是集合工具javadoc

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集合的提交者

Java8:

String[] strArray = {"eins", "zwei", "drei", "vier"};
Set<String> strSet = Arrays.stream(strArray).collect(Collectors.toSet());System.out.println(strSet);// [eins, vier, zwei, drei]

Java8

我们也可以选择使用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

msgstr"不保证类型、可变性、可串行性或返回Set的线程安全。”

所以最好使用后面的选项。输出是:[A, B, C, D][A, B, C, D][A, B, C, D]

不可变集(Java9)

Java9引入了Set.of静态工厂方法,它为提供的元素或数组返回不可变集。

@SafeVarargsstatic <E> Set<E> of​(E... elements)

查看不可变集静态工厂方法了解详情。

不可变集(Java10)

我们还可以通过两种方式获得不可变集:

  1. Set.copyOf(Arrays.asList(array))
  2. Arrays.stream(array).collect(Collectors.toUnmodifiableList());

方法Collectors.toUnmodifiableList()在内部使用了Java9中介绍的Set.of。还要检查我的这个回答以了解更多信息。

Varargs也会工作!

Stream.of(T... values).collect(Collectors.toSet());
Set<T> b = new HashSet<>(Arrays.asList(requiredArray));

我从上面的建议写了下面的-偷它……这很好!

/*** 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());}}
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

Java10

String[] strs = {"A", "B"};Set<String> set = Set.copyOf(Arrays.asList(strs));

Set.copyOf返回一个不可修改的Set,其中包含给定Collection的元素。

给定的Collection不能是null,它不能包含任何null元素。

使用CollectionUtilsstanford-postagger-3.0.jar中的ArrayUtils

import static edu.stanford.nlp.util.ArrayUtils.asSet;orimport static edu.stanford.nlp.util.CollectionUtils.asSet;
...String [] array = {"1", "q"};Set<String> trackIds = asSet(array);

已经有很多很好的答案,但其中大多数都不适用于原语数组(如int[]long[]char[]byte[]等)。

在Java8及更高版本中,您可以将数组打包为:

Integer[] boxedArr = Arrays.stream(arr).boxed().toArray(Integer[]::new);

然后使用stream转换为set:

Stream.of(boxedArr).collect(Collectors.toSet());

对于任何解决Android的人:

静态编程语言集合解决方案

星号*spread运算符。它单独应用集合中的所有元素,每个元素按vararg方法参数的顺序传递。它等效于:

val myArray = arrayOf("data", "foo")val mySet = setOf(*myArray)
// Equivalent toval 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>()

如果你需要构建一个只有一个元素的不可变集,你可以使用Collections.singleton(...)。这是一个例子:

Set<String> mySet = Collections.singleton("Have a good day :-)");

这并没有回答最初的问题,但可能对某人有用(至少对我有用)。如果你认为这个答案不合适,告诉我,我会删除它。