私は、設定された重みを持つアイテムのリストを取り、ランダムに1を選択するメソッドを作成しようとしています。私の解決策は、Integerをハッシュマップから1つのキーをランダムに選択するウェイトとして使用するハッシュマップを使用することでした。 HashMapのキーは、Objectの種類を混在させることができ、選択したキーのうち1つを返すことができます。突然変異を避けながらヌル値を返さないようにするにはどうすればよいですか?
しかし、私はnull
の値を突然変異を避けることの上に返すことを避けたいと思います。はい、私はこれがJavaであることは分かっていますが、Javaを書いて、この問題を解決するためにはより洗練された方法があります。
public <T> T getRandomValue(HashMap<?, Integer> VALUES) {
final int SIZE = VALUES.values().stream().reduce(0, (a, b) -> a + b);
final int RAND_SELECTION = ThreadLocalRandom.current().nextInt(SIZE) + 1;
int currentWeightSum = 0;
for (Map.Entry<?, Integer> entry : VALUES.entrySet()) {
if (RAND_SELECTION > currentWeightSum && RAND_SELECTION <= (currentWeightSum + entry.getValue())) {
return (T) entry.getKey();
} else {
currentWeightSum += entry.getValue();
}
}
return null;
}
最初に、listがnullであり、結果をOptionalにラップするかどうかを確認します。だから、オブジェクトが戻ってきて、いくつかの値を持っていて、簡単にチェックすることができます。しかし、nullを返すJavaでは、nullが正常であれば+ valueing + valueingをチェックするので、nullを避けることを考えるかもしれない – LenglBoy