2017-06-05 50 views

回答

1

您可以簡單地改變這條線,在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)); 
} 

原因remove()去除

或者之後返回相關的值,如果你需要後刪除元素選擇你可以使用其他解決方案。所有的元素添加到「鏈表」,每個元件必須加入許多次,因爲它重量,然後使用Collections.shuffle()其中,根據JavaDoc

隨機

使用的置換隨機性的缺省源指定列表。所有排列發生的可能性幾乎相等。

最後,獲取和使用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當然,它也應該根據程序邏輯進行更改。也許,第二種解決方案將更適合您的目的。 –