2011-05-16 98 views

回答

31

A Map並非真的像List那樣排列,這意味着您無法通過索引訪問Map項目。因此,洗牌總體上沒有意義。但是你可以做的是這樣的(我省略了例如仿製藥):

Map map = new HashMap(); 

// [...] fill the map 

List keys = new ArrayList(map.keySet()); 
Collections.shuffle(keys); 
for (Object o : keys) { 
    // Access keys/values in a random order 
    map.get(o); 
} 
4

沒有點在其鍵洗牌HashMap的鍵,因爲HashMap的不保留任何順序(既不自然也不插入) 。如果我們正在討論LinkedHashMap(它維護插入順序),那麼問題就很有意義。在這種情況下,您可以創建一個新的LinkedHashMap,並隨機插入密鑰。

然後,假設map是您的源映射(LinkedHashMap),此處生成新映射(LinkedHashMap)的代碼(名爲shuffleMap),其中鍵是混洗的。

List<Integer> list = new ArrayList<>(map.keySet()); 
    Collections.shuffle(list); 

    Map<Integer, String> shuffleMap = new LinkedHashMap<>(); 
    list.forEach(k->shuffleMap.put(k, map.get(k))); 
+0

HashMap不*保證*任何順序,但在我的實驗中,我發現檢索順序在許多(實際上,總是)執行中是相同的。這是不是很奇怪? – bikashg 2017-05-08 09:12:04

+0

@bikashg試試這個:Map map = new HashMap <>(); map.put(4,「」); map.put(3,「」); map.forEach((k,v) - > System.out.println(k));插入的順序不能保證。 – 2017-08-11 22:44:30