0

BitSetの配列にint配列に関する情報を入力しようとしています

    //ar is a SIZE*SIZE 1-D int array, SIZE is a constant

    //decare BitSet array
    BitSet bs[] = new BitSet[SIZE];

    //initialize BitSet array
    for (BitSet x:bs)
        x = new BitSet();

    //populate BitSet array
    for (int i = 0 ; i < ar.length ; i++)
        if (ar[i] > 0)
            bs[(i/SIZE)].set(SIZE-(i%SIZE));

最後の行は問題のようですが、ロジックに問題はありません。何か案は?

これをもう少し明確にするために、0,3,4,5,0,1,0,0,1,2,7,0,2,3,0,3,2,0、のような配列がある場合0,0,2,1,5,8,0,0,0,0,0,1,0,0,0,6,0,0

011101,001110,110110,001111,000001,000100として表すことができるビットセット配列を取得したい

4

3 に答える 3

7

問題は、強化された for ループの理解不足です。基本的:

for (BitSet x:bs)
    x = new BitSet();

単なるシンタティックシュガーです。コンパイラはそれを次のように展開します。

for (int i = 0; i < bs.length; i++) {
    BitSet x = bs[i];
    x = new BitSet();
}

この展開では、単に新しいビット セットを割り当てて破棄しているだけであることは明らかxです。実際には配列をまったく変更していません。次のように配列を初期化する必要があります。

for (int i = 0; i < bs.length; i++) {
    bs[i] = new BitSet();
}
于 2012-11-16T09:24:07.677 に答える
3

Java では、「foreach」コンストラクトは次のように機能します。

for (BitSet x:bs)
  x = new BitSet();

// is the same as:

for (int i = 0; i < bs.length; i++) {
  BitSet x = bs[i];
  x = new BitSet();
}

あなたの問題は、配列に代入しないことであり、「foreach」構造でそれを行う方法はありません。単純な「for」ループを使用する必要があります。

for (int i = 0; i < bs.length; i++) {
  bs[i] = new BitSet();
}
于 2012-11-16T09:24:04.930 に答える
1

新しく作成されたオブジェクトを一時変数に割り当てていますx

以下のようなものを試してください..

        int i=0;
        for (BitSet x:bs)
            {
                x = new BitSet();
                bs[i++] = x; //This will initialize the array elements
            }
于 2012-11-16T09:24:19.440 に答える