2011-05-16 97 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