所以您知道如何按值对Map 进行排序,也许可以通过阅读以下答案:Sort a Map by values (Java),其中 Java 8 版本的答案是:
m1sorted = m1.entrySet()
.stream()
.sorted(Map.Entry.comparingByValue(Collections.reverseOrder()))
.collect(Collectors.toMap(
Map.Entry::getKey,
Map.Entry::getValue,
(e1, e2) -> e1,
LinkedHashMap::new
));
那么如何根据m1 的值对m2 和m3 进行排序?
简单:您提供一个 Comparator 到 sorted() 来比较这些值,例如
.sorted(Comparator.comparing(e -> m1.get(e.getKey())).reversed())
您可能必须明确指定e 的类型,因为推理引擎可能会丢失:comparing((Entry<String, String> e) ->
如果您不喜欢 Comparator.comparing() 和 reversed(),以及推理问题,您可以使用 lambda。
这是所有代码,作为概念证明:
Map<String, Integer> m1 = new HashMap<>();
m1.put("c1", 3);
m1.put("c2", 24);
m1.put("c3", 12);
Map<String, String> m2 = new HashMap<>();
m2.put("c1", "A");
m2.put("c2", "B");
m2.put("c3", "C");
Map<String, Double> m3 = new HashMap<>();
m3.put("c1", 3.4);
m3.put("c2", 4.6);
m3.put("c3", 12.3);
Map<String, Integer> m1s =
m1.entrySet()
.stream()
.sorted((e1, e2) -> Integer.compare(e2.getValue(), e1.getValue()))
.collect(Collectors.toMap(Map.Entry::getKey,
Map.Entry::getValue,
(e1, e2) -> e1,
LinkedHashMap::new));
Map<String, String> m2s =
m2.entrySet()
.stream()
.sorted((e1, e2) -> Integer.compare(m1.get(e2.getKey()), m1.get(e1.getKey())))
.collect(Collectors.toMap(Map.Entry::getKey,
Map.Entry::getValue,
(e1, e2) -> e1,
LinkedHashMap::new));
Map<String, Double> m3s =
m3.entrySet()
.stream()
.sorted((e1, e2) -> Integer.compare(m1.get(e2.getKey()), m1.get(e1.getKey())))
.collect(Collectors.toMap(Map.Entry::getKey,
Map.Entry::getValue,
(e1, e2) -> e1,
LinkedHashMap::new));
System.out.println(m1s);
System.out.println(m2s);
System.out.println(m3s);
输出
{c2=24, c3=12, c1=3}
{c2=B, c3=C, c1=A}
{c2=4.6, c3=12.3, c1=3.4}
注意 e2 和 e1 在 lambdas 中是如何颠倒的,从而导致降序。
当然,最好使用Java的面向对象特性,并且只有一个Map来表示具有三个字段值的对象。