3

配列が別の配列のサブセットであることを確認したい。

プログラムは false を出力しますが、私は true を期待しています。containsAll が 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);
4

2 に答える 2

12

微妙なバグがあります:

new HashSet(Arrays.asList(subset));

上記の行は、期待したように整数のセットを作成しません。代わりに、配列HashSet<int[]>という単一の要素を持つ を作成します。subset

これは、ジェネリックがプリミティブ型をサポートしていないという事実に関係しています。

sublistandsuplistを as として宣言した場合、コンパイラは間違いについて教えてくれますHashSet<Integer>

その上、あなたは電話suplistsublist間違った方向に進んでしまいました。containsAll()

以下は期待どおりに機能します。

    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);

重要な変更点の 1 つは、これがInteger[]の代わりに使用されていることですint[]

于 2013-03-27T16:43:30.200 に答える
0

初期化の問題 ( NPEで識別) はとして、2 つのセットを混同しており、実際に必要なのは次のとおりです。

boolean isSubset = suplist.containsAll(Arrays.asList(sublist));

すなわち{10,20,30,40,60}、含まれています{10,20,30}か?(もちろんそうです)

于 2013-03-27T16:43:17.350 に答える