【发布时间】:2020-05-05 10:40:29
【问题描述】:
我正在尝试反转嵌套 Map 的顺序。
由于 Map 中没有内置函数来反转顺序,所以我没时间了。我尝试了几种可用的方法来反转开发人员发布的顺序,但没有任何效果,而且我也没有看到任何错误。我不知道代码有什么问题,可能是因为我没有太多使用 Map,而且我对 java 比较陌生。
这是地图的结构
Map<String, HashMap<String, Object>> playersDataMap = new HashMap<> ();
这些是我从网站上复制的几种方法,但都没有奏效。它总是以相同的顺序返回给我。
public static <K extends Comparable, V> Map<K,V> sortByKeys(Map<K,V> map)
{
Map<K, V> treeMap = new TreeMap<>(new Comparator<K>() {
@Override
public int compare(K a, K b) {
return b.compareTo(a);
}
});
treeMap.putAll(map);
return treeMap;
}
public static <K, V> Map<K,V> sortByTreeMap(Map<K,V> unsortedMap)
{
// construct a TreeMap from given Map and return a reverse order
// view of the mappings contained in this map
return new TreeMap<>(unsortedMap).descendingMap();
}
我也尝试将 HashMap 更改为 LinkedHashMap 但没有成功,结果相同。
请告诉我代码有什么问题。我真的没时间了,否则我会在发布甚至实施之前阅读地图文档。对你的帮助表示感谢。谢谢
这是我正在尝试实现的示例
Map<String, HashMap<String, Object>> playersDataMap = new LinkedHashMap<> ();
for (int i = 1; i < 40; i++)
{
HashMap<String, Object> playerMap = new HashMap<> ();
playerMap.put ("name", "abc"+i);
playerMap.put ("pointsScored", i * 10);
playersDataMap.put ("x"+i, playerMap);
}
Map<String, HashMap<String, Object>> inversedPlayerDataMap = new LinkedHashMap<>();
inversedPlayerDataMap = new TreeMap<>(Comparator.reverseOrder());
inversedPlayerDataMap.putAll(playersDataMap);
for (Map.Entry<String, HashMap<String, Object>> player : inversedPlayerDataMap.entrySet ())
{
System.out.printf ("Debug: player key: %s playerValueScore: %s \n", player.getKey (), player.getValue ().get("pointsScored"));
}
结果:“调试:播放器密钥:x9 点得分:90” “调试:播放器密钥:x390 点得分:390” “调试:播放器密钥:x30 点得分:30”...
预期输出:“调试:播放器密钥:x390 点得分:390”“调试:播放器密钥:x380 点得分:380”...
【问题讨论】:
-
如果您测试了上述 2 种方法,那么您的期望很可能是有问题的。请添加测试数据和预期输出
-
另外我正在以这种方式创建排序地图的新参考变量 Map
> inversedPlayerDataMap = sortByKeys (playersDataMap);希望没有问题 -
感谢@ernest_k,正如我已经说过的,我对 java 比较陌生,所以我可能在上面真的很奇怪。你知道有什么更快的方法来解决这个问题吗?在使用测试数据之前...
-
@Voodoo 在第一个代码 sn-p
-
你有
String键,字符串的自然顺序是它们的字典顺序。换句话说,"x9" > "x390"。你需要像Comparator.comparingInt((String s) -> Integer.parse(s.substring(1))).reversed()这样的东西来按数值降序排序。但是,当键具有更复杂的模式(即单词和数字的混合)时,提供所需顺序的比较器并非易事。
标签: java java-8 hashmap java-9