根据多个值对地图排序(Java8 / Jooq)

时间:2018-11-09 16:22:04

标签: java-8 jooq

我们有一个看起来像这样的数据结构:

Map<String, Double> responseMap;

然后根据值按降序对地图进行排序:

responseMap.entrySet().stream()
        .sorted((Map.Entry.<String, Double>comparingByValue().reversed()))
        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, 
                                      (e1, e2) -> e1, LinkedHashMap::new));

现在此地图的数据结构更改为:

Map<String, Tuple2<Double, Integer> responseMap;  //org.jooq.lambda.tuple.Tuple2

我们如何整洁地根据新值(基于Double值和Integer)将此映射排序?

1 个答案:

答案 0 :(得分:4)

您只需更改比较器:

responseMap.entrySet().stream()
    .sorted(Comparator.comparing((Map.Entry<String, Tuple2<Double, Integer> e) -> 
                                  e.getValue().v1())
                      .thenComparing(e -> e.getValue().v2())
                      .reversed())
    .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, 
                                  (e1, e2) -> e1, LinkedHashMap::new));

编辑(根据评论):

或者,您也可以使用:

responseMap.entrySet().stream()
    .sorted(Comparator.comparing(Collections.reverseOrder(Map.Entry.comparingByValue(
            Comparator.comparing(Tuple2::v1).thenComparing(Tuple2::v2)))))
    .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, 
                                  (e1, e2) -> e1, LinkedHashMap::new));