Java int []数组到HashSet <integer> </integer>

时间:2012-08-19 23:03:02

标签: java generics collections

我有一个int数组:

int[] a = {1, 2, 3};

我需要一个打字的设置:

Set<Integer> s;

如果我执行以下操作:

s = new HashSet(Arrays.asList(a));
当然,它认为我的意思是:

List<int[]>

而我的意思是:

List<Integer>

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

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

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

A) int[] a...

B) Integer[] a ...

谢谢!

7 个答案:

答案 0 :(得分:13)

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

public static <T> List<T> asList(T... a)

所以,如果你这样做:

List<Integer> list = Arrays.asList(1, 2, 3, 4)

或者这个:

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

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

但是,这不起作用

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

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

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

public static List<Integer> asList(int i...);

答案 1 :(得分:7)

使用流:

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

答案 2 :(得分:5)

或者您可以轻松使用Guavaint[]转换为List<Integer>

Ints.asList(int...)

  

asList

     

public static List<Integer> asList(int... backingArray)

     

返回由指定数组支持的固定大小列表,类似于Arrays.asList(Object[])。该列表支持List.set(int, Object),但任何将值设置为null的尝试都会产生NullPointerException

     

返回的列表维护写入或读取的Integer个对象的值,但不保留其身份。例如,未指定list.get(0) == list.get(0)对于返回的列表是否为真。

答案 3 :(得分:5)

该问题会提出两个不同的问题:将<div class="col-lg-5"> <?php $form = ActiveForm::begin(['id' => 'station-form', 'options' => ['enctype' => 'multipart/form-data']]); ?> <?= $form->field($model, 'name') ?> <?= $form->field($model, 'address') ?> <?= $form->field($model, 'phone') ?> <?= $form->field($model, 'price') ?> <?= $form->field($model, 'square') ?> <?= $form->field($model, 'content')->textarea() ?> <?= $form->field($model, 'services_id[]')->checkboxList($items2) ?> 转换为int[]并从Integer[]创建HashSet<Integer>。使用Java 8流很容易做到这两点:

int[]

答案 4 :(得分:3)

您可以在Apache Commons中使用ArrayUtils:

int[] intArray  = { 1, 2, 3 };
Integer[] integerArray = ArrayUtils.toObject(intArray);

答案 5 :(得分:1)

另一种选择是使用Eclipse Collections中的原始集。您可以轻松地将int[]转换为MutableIntSetSet<Integer>Integer[],如下所示,或者您可以使用MutableIntSet更高效的内存和高性能。

int[] a = {1, 2, 3};
MutableIntSet intSet = IntSets.mutable.with(a);
Set<Integer> integerSet = intSet.collect(i -> i);  // auto-boxing
Integer[] integerArray = integerSet.toArray(new Integer[]{});

如果你想直接从int数组转到Integer数组并保留顺序,那么这将有效。

Integer[] integers = 
        IntLists.mutable.with(a).collect(i -> i).toArray(new Integer[]{});

注意:我是Eclipse Collections的提交者

答案 6 :(得分:0)

只需使用以下代码段将数组中的元素添加到Set中

public class RemoveDuplicateElements {

    public static void main(String args[]){
        int array[] =  {0,1,2,3,4,5,6,7,8,9,1,2,3,4,5};
        Set <Integer> abc = new HashSet <Integer>();
        for (Integer t:array){  
            abc.add(t); 
        }       
        System.out.println("sampleSet"+abc);  
    }

}