0

複数の型の変数を含むクラスがありますが、それらのほとんど (約 30) は double です。

String something;
double x;
double y;
double z;
...

double を反復処理したいだけでなく、派生クラスがそれらのほとんどを使用するため、配列内ではなく、この「古典的な方法」で記述したままにします。私が今問題を抱えている関数は、すべての double 型の変数を反復処理し、そのうちのいくつがゼロでないかを見つけてから、これらすべての変数の 1 つをランダムに選択する方法です。このクラスには何千ものインスタンスがあり、私が言ったように、これを拡張するクラスがあります。だから私は解決策に取り組んでいます。できれば疑似のようなものです:

nonzeros = 0
foreach doubleVarInClass variable
{
    if (variable != 0)
    nonzeros++;
}
if (nonzeros < parameter)
{
    randomDoubleVarInClass = random.next(...);
}

私が考えていた1つの解決策は、HashMapを使用してすべての変数を保持することでしたが、これを使用するすべてのクラスを書き直す必要があり、パフォーマンスにどのように影響するかわかりません。 . パフォーマンスを恐れて、おそらく古典的な配列で何かを試す必要がありますか? 何もなければ、少なくとも変数名を保持したいと思います。これらの変数への参照を含む配列について考えたので、このように記述し続けることができますが、Java での値の受け渡しが原因で可能かどうかはわかりません。

また、そのうちのいくつがゼロでないか、または効率的な機能を持っているかについての情報を保持する構造があるのでしょうか?

私の問題を解決できる情報をありがとう:)

4

1 に答える 1

1

これにはリフレクションを使用することをお勧めします。次の名前のクラスのインスタンスがあるとしますo

int nonzeros = 0;
for (Field f : o.getClass().getDeclaredFields()) {
  f.setAccessible(true);
  if (f.getType().equals(Double.TYPE) && f.getDouble(o) != 0.0) {
    nonzeros++;
  }
}

注: Java リフレクションはパフォーマンスの観点からはおそらく悪い考えであり、その観点から最初にこれをテストする必要があります。それに加えて、これにより、クラス定義を変更することなく簡単にチェックできます。Java 6 では、リフレクションのパフォーマンスは古いバージョンよりもわずかに優れているため、個人的なユース ケースと環境でこれを確認する必要があります。

于 2013-02-24T19:40:08.453 に答える