Java int []数组到HashSet <Integer>

Rob*_*ino 27 java generics collections

我有一个int数组:

int[] a = {1, 2, 3};
Run Code Online (Sandbox Code Playgroud)

我需要一个类型集:

Set<Integer> s;
Run Code Online (Sandbox Code Playgroud)

如果我执行以下操作:

s = new HashSet(Arrays.asList(a));
Run Code Online (Sandbox Code Playgroud)

当然,它认为我的意思是:

List<int[]>
Run Code Online (Sandbox Code Playgroud)

而我的意思是:

List<Integer>
Run Code Online (Sandbox Code Playgroud)

这是因为int是一个原语.如果我使用过String,那么一切都会起作用:

Set<String> s = new HashSet<String>(
    Arrays.asList(new String[] { "1", "2", "3" }));
Run Code Online (Sandbox Code Playgroud)

如何轻松,正确和简洁地从:

A) int[] a...
Run Code Online (Sandbox Code Playgroud)

B) Integer[] a ...
Run Code Online (Sandbox Code Playgroud)

谢谢!

小智 32

使用流:

// int[] nums = {1,2,3,4,5}
Set<Integer> set = Arrays.stream(nums).boxed().collect(Collectors.toSet())
Run Code Online (Sandbox Code Playgroud)

  • 这应该是这个问题的最佳答案。 (4认同)

Mat*_*att 12

进一步解释.asList方法具有此签名

public static <T> List<T> asList(T... a)
Run Code Online (Sandbox Code Playgroud)

所以,如果你这样做:

List<Integer> list = Arrays.asList(1, 2, 3, 4)
Run Code Online (Sandbox Code Playgroud)

或这个:

List<Integer> list = Arrays.asList(new Integer[] { 1, 2, 3, 4 })
Run Code Online (Sandbox Code Playgroud)

在这些情况下,我相信java能够推断出你想要一个List,所以它填充了type参数,这意味着它需要Integer参数来调用方法.因为它能够将值从int自动变换为整数,所以很好.

但是,这不起作用

List<Integer> list = Arrays.asList(new int[] { 1, 2, 3, 4} )
Run Code Online (Sandbox Code Playgroud)

因为原始的包装器强制(即int []到Integer [])没有内置到语言中(不确定为什么他们不这样做,但他们没有).

因此,每个基本类型都必须按照自己的重载方法进行处理,这是commons包的功能.即.

public static List<Integer> asList(int i...);
Run Code Online (Sandbox Code Playgroud)

  • 问题的标题是“Java int[] array to HashSet&lt;Integer&gt;”,而您的答案中没有“HashSet”。 (13认同)

Jef*_*oom 8

该问题提出两个单独的问题:转换int[]Integer[]HashSet<Integer>从中创建int[]。两者都可以通过Java 8流轻松实现:

int[] array = ...
Integer[] boxedArray = IntStream.of(array).boxed().toArray(Integer[]::new);
Set<Integer> set = IntStream.of(array).boxed().collect(Collectors.toSet());
//or if you need a HashSet specifically
HashSet<Integer> hashset = IntStream.of(array).boxed()
    .collect(Collectors.toCollection(HashSet::new));
Run Code Online (Sandbox Code Playgroud)