Java containsAll does not return true when given lists

contains, hashset, java, subset

Solution

There is a subtle bug in:

new HashSet(Arrays.asList(subset));

The above line does not create a set of integers as you might have expected. Instead, it creates a `HashSet<int[]>` with a single element, the `subset` array.

This has to do with the fact that generics don't support primitive types.

Your compiler would have told you about the mistake if you declared `sublist` and `suplist` as `HashSet<Integer>`.

On top of that, you got `suplist` and `sublist` the wrong way round in the `containsAll()` call.

The following works as expected:

    Integer[] subset = new Integer[]{10, 20, 30};
    Integer[] superset = new Integer[]{10, 20, 30, 40, 60};
    HashSet<Integer> sublist = new HashSet<Integer>(Arrays.asList(subset));
    HashSet<Integer> suplist = new HashSet<Integer>(Arrays.asList(superset));
    boolean isSubset = suplist.containsAll(sublist);
    System.out.println(isSubset);

One key change is that this is using `Integer[]` in place of `int[]`.

Problem

I want to check an array is subset of another array. The program prints false, but I expect true. Why isn't containsAll returning true? ``` int[] subset; subset = new int[3]; subset[0]=10; subset[1]=20; subset[2]=30; int[] superset; superset = new int[5]; superset[0]=10; superset[1]=20; superset[2]=30; superset[3]=40; superset[4]=60; HashSet sublist = new HashSet(Arrays.asList(subset)); HashSet suplist = new HashSet(Arrays.asList(superset)); boolean isSubset = sublist.containsAll(Arrays.asList(suplist)); System.out.println(isSubset); ```

Original source