如何在 Java 中将数组转换为集合
我想在 Java 中将数组转换为 Set。有一些明显的方法可以做到这一点(即使用循环),但我想要一些更简洁的方法,例如:
java.util.Arrays.asList(Object[] a);
有什么想法吗?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
我想在 Java 中将数组转换为 Set。有一些明显的方法可以做到这一点(即使用循环),但我想要一些更简洁的方法,例如:
java.util.Arrays.asList(Object[] a);
有什么想法吗?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(19)
new HashSet
但我认为这会更有效:
new HashSet<Object>(Arrays.asList(Object[] a));
But I think this would be more efficient:
像这样:
在Java 9+中,如果不可修改的集合是可以的:
在Java 10+中,可以从数组组件类型推断泛型类型参数:
小心
如果您想要一个不可修改的集合并且数组中可能有重复的元素,请执行以下操作:
Like this:
In Java 9+, if unmodifiable set is ok:
In Java 10+, the generic type parameter can be inferred from the arrays component type:
Be careful
If you want an unmodifiable set and you might have duplicate elements in the array, do the following:
那是 Collections.addAll(java.util.Collection, T...)。
另外:如果我们的数组充满了基元怎么办?
对于 JDK 8、我只需编写明显的
for
循环即可一次完成包装和添加到集合。对于 JDK >= 8,一个有吸引力的选项是这样的:
That's Collections.addAll(java.util.Collection, T...) from JDK 6.
Additionally: what if our array is full of primitives?
For JDK < 8, I would just write the obvious
for
loop to do the wrap and add-to-set in one pass.For JDK >= 8, an attractive option is something like:
使用 Guava,您可以执行以下操作:
With Guava you can do:
Java 8:
Java 8:
Varargs 也可以工作!
Varargs will work too!
Java 8
我们也可以选择使用
Stream
。我们可以通过多种方式获取流:Collectors.toSet()
的源代码显示元素被逐一添加到HashSet
中,但规范不保证它会被添加到HashSet
中。一个HashSet
。因此最好使用后面的选项。输出为:
<代码>
[甲、乙、丙、丁]
[甲、乙、丙、丁]
[A, B, C, D]
不可变集 (Java 9)
Java 9 引入了
Set.of
静态工厂方法,该方法为所提供的元素或数组返回不可变集。检查不可变设置静态工厂方法细节。
不可变集 (Java 10)
我们还可以通过两种方式获取不可变集:
Set.copyOf(Arrays.asList(array))
Arrays.stream(array).collect(Collectors.toUnmodifyingList ());
方法
Collectors.toUnmodifyingList()
内部使用了 Java 9 中引入的Set.of
。另请检查此 我的回答了解更多信息。Java 8
We have the option of using
Stream
as well. We can get stream in various ways:The source code of
Collectors.toSet()
shows that elements are added one by one to aHashSet
but specification does not guarantee it will be aHashSet
.So it is better to use the later option. The output is:
[A, B, C, D]
[A, B, C, D]
[A, B, C, D]
Immutable Set (Java 9)
Java 9 introduced
Set.of
static factory method which returns immutable set for the provided elements or the array.Check Immutable Set Static Factory Methods for details.
Immutable Set (Java 10)
We can also get an immutable set in two ways:
Set.copyOf(Arrays.asList(array))
Arrays.stream(array).collect(Collectors.toUnmodifiableList());
The method
Collectors.toUnmodifiableList()
internally makes use ofSet.of
introduced in Java 9. Also check this answer of mine for more.执行
Arrays.asList(array)
后,您可以执行Set set = new HashSet(list);
这是一个示例方法,您可以编写:
After you do
Arrays.asList(array)
you can executeSet set = new HashSet(list);
Here is a sample method, you can write:
已经有很多很好的答案,但其中大多数不适用于基元数组(例如
int[]
、long[]
、char []
、byte[]
等)在 Java 8 及更高版本中,您可以使用以下方式对数组进行装箱:
然后使用流转换为集合:
There has been a lot of great answers already, but most of them won't work with array of primitives (like
int[]
,long[]
,char[]
,byte[]
, etc.)In Java 8 and above, you can box the array with:
Then convert to set using stream:
在 Eclipse Collections 中,以下内容将起作用:
注意:我是 Eclipse Collections 的提交者
In Eclipse Collections, the following will work:
Note: I am a committer for Eclipse Collections
快点:你可以做:
并逆转
Quickly : you can do :
and to reverse
我根据上面的建议写了下面的内容 - 偷走它......这很好!
I've written the below from the advice above - steal it... it's nice!
有时使用一些标准库会有很大帮助。尝试查看 Apache Commons Collections。在这种情况下,您的问题只是转换为类似的内容
,这是 CollectionsUtils javadoc
Sometime using some standard libraries helps a lot. Try to look at the Apache Commons Collections. In this case your problems is simply transformed to something like this
And here is the CollectionsUtils javadoc
使用
stanford-postagger-3.0.jar
中的CollectionUtils
或ArrayUtils
Use
CollectionUtils
orArrayUtils
fromstanford-postagger-3.0.jar
在 Java 10 中:
Set.copyOf
返回一个不可修改的Set
,其中包含给定Collection
的元素。给定的
Collection
不得为null
,并且不得包含任何null
元素。In Java 10:
Set.copyOf
returns an unmodifiableSet
containing the elements of the givenCollection
.The given
Collection
must not benull
, and it must not contain anynull
elements.输出是
改变它的
输出是
the output is
change it to
the output is
对于任何解决 Android 问题的人:
Kotlin Collections 解决方案
星号
*
是spread
运算符。它单独应用集合中的所有元素,每个元素按顺序传递给vararg
方法参数。它相当于:不传递参数
setOf()
会导致空集。除了
setOf
之外,您还可以将其中任何一个用于特定的哈希类型:这是显式定义集合项类型的方法。
For anyone solving for Android:
Kotlin Collections Solution
The asterisk
*
is thespread
operator. It applies all elements in a collection individually, each passed in order to avararg
method parameter. It is equivalent to:Passing no parameters
setOf()
results in an empty set.In addition to
setOf
, you can also use any of these for a specific hash type:This is how to define the collection item type explicitly.
如果您需要构建一个仅包含一个元素的不可变集,可以使用
Collections.singleton(...)
。这是一个例子:这并没有回答原来的问题,但可能对某人有用(至少对我有用)。如果您认为这个答案不合适,请告诉我,我将删除它。
If you need to build an immutable set with only one element inside it, you can use
Collections.singleton(...)
. Here is an example:This doesn't answer the original question but might be useful to someone (it would have been at least to me). If you think this answer does not fit just tell me and I will delete it.