如何正确添加数组?

时间:2015-12-27 05:59:53

标签: java set

我试图将Integer数组添加到Set中,如下所示,

int[] arr = { 2, 6, 4 , 2, 3, 3, 1, 7 }; 
Set<Integer> set = new HashSet<Integer>(Arrays.asList(arr));

我收到了一些错误消息,

myTest.java:192: error: no suitable constructor found for HashSet(List<int[]>)
    Set<Integer> set = new HashSet<Integer>(Arrays.asList(arr));
                       ^
constructor HashSet.HashSet(Collection<? extends Integer>) is not applicable
  (argument mismatch; inferred type does not conform to upper bound(s)
      inferred: int[]
      upper bound(s): Integer,Object)
constructor HashSet.HashSet(int) is not applicable
  (argument mismatch; no instance(s) of type variable(s) T exist so that List<T> conforms to int)
 where T is a type-variable:
T extends Object declared in method <T>asList(T...)
Note: Some messages have been simplified; recompile with -Xdiags:verbose to        get full output
   1 error

其次,我也尝试如下并仍然出错,

int[] arr = { 2, 6, 4 , 2, 3, 3, 1, 7 }; 
Set<Integer> set = new HashSet<Integer>( );
Collections.addAll(set, arr);

如何正确地将整数数组添加到Java中?谢谢。

4 个答案:

答案 0 :(得分:9)

您需要使用包装类型来使用Arrays.asList(T...)

Integer[] arr = { 2, 6, 4, 2, 3, 3, 1, 7 };
Set<Integer> set = new HashSet<>(Arrays.asList(arr));

手动添加元素,如

int[] arr = { 2, 6, 4, 2, 3, 3, 1, 7 };
Set<Integer> set = new HashSet<>();
for (int v : arr) {
    set.add(v);
}

最后,如果您需要保留广告订单,可以使用LinkedHashSet

答案 1 :(得分:3)

  

myTest.java:192: error: no suitable constructor found for HashSet(List<int[]>)

请注意,java中的数组为Objects,因此Arrays.asList(int[])会将int[]内部视为单个元素。因此,<T> List<T> asList(T... a)将创建List<int[]>而不是List<Integer>,因此您无法从数组集合(而不是Set<Integer>元素)创建Integer

可能的解决方案可能是,只使用Integer(包装类)而不是int(基本类型)。(Elliott Frisch已经说明了这一点。)

如果您使用Java-8并获取int[]且无法更改为Integer[]

int[] arr = { 2, 6, 4, 2, 3, 3, 1, 7 };
Integer[] wrapper = Arrays.stream(arr).boxed().toArray(Integer[]::new);
Set<Integer> set = new HashSet<Integer>(Arrays.asList(wrapper));

此外,正如Louis Wasserman指出的那样,如果您使用的是java-8,则可以直接将数组元素收集到Set

Set<Integer> set = Arrays.stream(arr).boxed().collect(Collectors.toSet());

答案 2 :(得分:2)

您尝试插入Set int值,但Set存储Integer

更改

int[] arr = { 2, 6, 4, 2, 3, 3, 1, 7 };

Integer[] arr = { 2, 6, 4, 2, 3, 3, 1, 7 };

同样,当您要创建一个Set of of Integers时,请记住Integers在范围-127 to +128之间有一个特殊的Integer缓存池。具有此范围内值的所有Integer对象引用池中的相同对象。因此,不会为Set中的整数分配新的内存。

答案 3 :(得分:-1)

从Java 8开始,您可以使用Stream。

int[] arr = { 2, 6, 4 , 2, 3, 3, 1, 7 };

Set<Integer> set = Arrays.stream(number).boxed().collect(Collectors.toSet());

这应该有效。