Java int[] array to HashSet

前端 未结 7 2098
感情败类
感情败类 2020-12-29 20:54

I have an array of int:

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

I need a typed set from it:

Set s;

If I do th

相关标签:
7条回答
  • 2020-12-29 21:21

    Some further explanation. The asList method has this signature

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

    So if you do this:

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

    or this:

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

    In these cases, I believe java is able to infer that you want a List back, so it fills in the type parameter, which means it expects Integer parameters to the method call. Since it's able to autobox the values from int to Integer, it's fine.

    However, this will not work

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

    because primitive to wrapper coercion (ie. int[] to Integer[]) is not built into the language (not sure why they didn't do this, but they didn't).

    As a result, each primitive type would have to be handled as it's own overloaded method, which is what the commons package does. ie.

    public static List<Integer> asList(int i...);
    
    0 讨论(0)
  • 2020-12-29 21:21

    Another option would be to use a primitive set from Eclipse Collections. You can easily convert an int[] to a MutableIntSet to a Set<Integer> or Integer[] as shown below, or you can use the MutableIntSet as is which will be much more memory efficient and performant.

    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[]{});
    

    If you want to go directly from the int array to the Integer array and preserve order, then this will work.

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

    Note: I am a committer for Eclipse Collections

    0 讨论(0)
  • 2020-12-29 21:37

    You can use ArrayUtils in Apache Commons:

    int[] intArray  = { 1, 2, 3 };
    Integer[] integerArray = ArrayUtils.toObject(intArray);
    
    0 讨论(0)
  • 2020-12-29 21:40

    The question asks two separate questions: converting int[] to Integer[] and creating a HashSet<Integer> from an int[]. Both are easy to do with Java 8 streams:

    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));
    
    0 讨论(0)
  • 2020-12-29 21:41

    Just add elements from array to Set with the below snippet

    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);  
        }
    
    }
    
    0 讨论(0)
  • 2020-12-29 21:43

    Using Stream:

    // int[] nums = {1,2,3,4,5}
    Set<Integer> set = Arrays.stream(nums).boxed().collect(Collectors.toSet())
    
    0 讨论(0)
提交回复
热议问题