重み付けテストデータを生成するために使用します。それは効率的ではないですが、
class ProbabilitySet<E> {
Set<Option<E>> options = new HashSet<Option<E>>();
class Option<E> {
E object;
double min;
double max;
private Option(E object, double prob) {
this.object = object;
min = totalProb;
max = totalProb + prob;
}
@Override
public String toString() {
return "Option [object=" + object + ", min=" + min + ", max=" + max + "]";
}
}
double totalProb = 0;
Random rnd = new Random();
public void add(E object, double probability){
Option<E> tuple = new Option<E>(object, probability);
options.add(tuple);
totalProb += probability;
}
public E getRandomElement(){
double no = rnd.nextDouble() * totalProb;
for (Option<E> tuple : options) {
if (no >= tuple.min && no < tuple.max){
return tuple.object;
}
}
return null; // if this happens sumfink is wrong.
}
@Override
public String toString() {
return "ProbabilitySet [options=" + options + ", totalProb=" + totalProb + "]";
}
}
簡単です注:確率パラメータはありません1.0
使い方に合計に対する次のようになります。
public static void main(String[] args) {
ProbabilitySet<String> stati = new ProbabilitySet<String>();
stati.add("TIMEOUT", 0.2);
stati.add("FAILED", 0.2);
stati.add("SUCCESSFUL", 1.0);
for (int i = 0; i < 100; i++) {
System.out.println(stati.getRandomElement());
}
}
コレクションは、通常その実装したクラスではありません'イテレータ '。 – thejh
あなたのコレクションは 'java.util.Collection'ですか? – thejh
メモリ消費量がそれほど大きくない必要があります。新しいコレクションは実際のデータへのポインタを保持するだけなので、新しいコレクションオブジェクトのサイズ!=コレクションのサイズです。 –