1

プロパティが現在intとbooleanであるいくつかのクラスには、いくつかのプロパティがあります。intは値であり、そのintが設定されている場合はブール値がtrueになります。

このペアリングが必要なのは、あるレベルに設定されていない場合は上のレベルの設定を使用するプロパティのレベルを持つオブジェクトを表しているためです。このアプローチにより、各レベルでその値が何であるか、およびそのレベルで設定されたか継承されたかを記録できます。

それは素晴らしい働きをします。ただし、これらのオブジェクトは文字通り100,000個になる可能性があります。そして、それは大量のメモリ、大量のガベージコレクションなどです。したがって、どうすればこれをより適切に実行できるかについてのアイデアはありません。列挙型をインデックスとして持つintとbooleansの配列を調べました。しかし、それは本当に厄介だと感じます。これは、一般的に、何かを間違える(つまり、バグを導入する)機会が増えることを意味します。

助言がありますか?

ありがとう-デイブ

4

7 に答える 7

7

の全範囲を使用していない場合は、またはintのような魔法の値を使用して「未設定」を表すことができます。Integer.MIN_VALUE-1

この例は、一致が見つからなかった場合にindexOf()返される String のメソッドです。-1

于 2012-06-22T16:12:31.830 に答える
3

int は正で、順序どおりですか (または、順序どおりでない場合は、巨大な値にはなりません)? つまり、1,2,3,4...99999,100000?

その場合は、java.util.BitSetを使用できます。

于 2012-06-22T16:14:59.163 に答える
3

ここでのほとんどの回答は、私が最初に提案したことをすでにカバーしていますが、ガベージコレクターの圧力の問題であり、メモリフットプリントがそれほど多くなく、32ビット整数の全範囲が本当に必要な場合は、同じ種類のビットマスキングを適用できます代わりに長いトリック。

次のような関数を持つユーティリティ クラスがあります。

long setIntValue(int i) { return 0xFFFF0000 | i; }
int getIntValue(long l) { return (int)(0xFFFF & l); }
boolean isIntValueSet(long l) { return (0xFFFF0000 & l) != 0; }
于 2012-06-22T16:22:58.417 に答える
2

2つの可能性が思い浮かび、

  • Integerオブジェクトを使用し、参照nullを使用して値が設定されていないことを指定します。
  • ints 値の範囲が範囲全体に及ばない場合は、値が設定されていないことを指定するような値を選択できますInteger.MIN_INT
于 2012-06-22T16:14:48.523 に答える
1

あなたはタプルクラスを作ることができます

public class Tuple<X,Y>{
    private final X x;
    private final Y y;

    public Tuple(X x,Y y){
        this.x=x;
        this.y=y;
    }

    public X getX(){
        return x;
    }

    public Y getY(){
        return y;
    }

}
于 2012-06-22T16:25:18.893 に答える
1

それぞれ 100K の要素を持つ int[] と boolean[] は、約 500K のメモリを使用します (そして 2 つのオブジェクトです)。

値を使用しintてフラグを保存することもできます。しかし、それがオプションでない場合は、long可能なすべての int 値とブール値を格納できる a を使用できます。

int[]またはのようなコレクションを使用してlong[]、行ベースの構造ではなく列ベースの構造にデータを格納できます。int[]boolean[]

于 2012-06-22T16:26:45.513 に答える