2017-06-05 3 views
0

@ PeterLawreyの の回答には評判がない:Random weighted selection in Java。それは良いです。しかし、今私はnext()と呼んで結果をAとし、再びAを得ることを避けるためにAの重量をmapから除去したいとします。どうすれば対処できますか?無作為に重み付けして選択した後、体重を取り除く

+0

可能な複製を使用して要素を取得し、削除(https://stackoverflow.com/questions/6409652/random-weighted-selection -in-java) –

答えて

1

あなたが後に要素を削除する必要がある場合は、単純に、また

を削除した後に関連付けられた値を返しますremove() PeterLawreyのソリューション

public E next() { 
    double value = random.nextDouble() * total; 
    return map.higherEntry(value).getValue(); 
} 

public E next() { 
    double value = random.nextDouble() * total--; 
    return map.remove(higherKey(value)); 
} 

の原因で、この行を変更することができます別のソリューションを使用することができます。それは重量であり、その後、ランダム乱数のデフォルトのソースを使用して、指定されたリストを並べ替える JavaDoc

によると、Collections.shuffle()を使用して「LinkedListの」内のすべての要素を追加し、各要素は何回として追加する必要があります。すべての並べ替えは、ほぼ等しい可能性で行われる。

最後に、[Javaでランダムな重み付きの選択]のpop()またはremoveFirst()

Map<String, Integer> map = new HashMap<String, Integer>() {{ 
    put("Five", 5); 
    put("Four", 4); 
    put("Three", 3); 
    put("Two", 2); 
    put("One", 1); 
}}; 

LinkedList<String> list = new LinkedList<>(); 

for (Map.Entry<String, Integer> entry : map.entrySet()) { 
    for (int i = 0; i < entry.getValue(); i++) { 
     list.add(entry.getKey()); 
    } 
} 

Collections.shuffle(list); 

System.out.println("Size: " + list.size()); 
int size = list.size(); 
for (int i = 0; i < size; i++) { 
    System.out.println(list.pop()); 
} 

System.out.println("Size: " + list.size()); 
+0

@kinglao私の答えは役に立ちましたか?あなたはそれを正しいものとして選ぶことができますか? –

+0

私はちょうど削除することはできないと思う。 'total'フィールドもまた – kinglao

+0

@kinglaoでも変わるはずですので、プログラムロジックによっても変更する必要があります。たぶん、第2のソリューションはあなたの目的により適しているでしょう。 –

関連する問題