2017-06-05 58 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当然,它也应该根据程序逻辑进行更改。也许,第二种解决方案将更适合您的目的。 –