当前位置: 首页 > 知识库问答 >
问题:

Java使用Collections.ReverseOrder()按值降序排列TreeMap

危彬彬
2023-03-14
private Map<String, Double> orderByDescValue(Map<String, Double> unorderedMap) {
    Stream<Map.Entry<String,Double>> sorted = unorderedMap.entrySet().stream()
            .sorted(Collections.reverseOrder(Map.Entry.comparingByValue()));
    return sorted.limit(Configuration.WORDCLOUD_SIZE)
            .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

}

我理解这是行不通的,因为它返回的是一个地图,不断言任何顺序,而不是一个TreeMap。但收藏者似乎没有一个toTreeMap,我不能铸造它--而且我不知道还能做什么。

或者这样不行,我必须用另一种方法来解决这个问题?

共有1个答案

施振海
2023-03-14

您可以利用LinkedHashMap将保留插入顺序这一事实--因此在Tomap调用中指定一个供应商,以便它适当地创建LinkedHashMap:

.collect(Collectors.toMap(
    Map.Entry::getKey,
    Map.Entry::getValue,
    (x, y) -> { throw new IllegalStateException("Unexpected merge request"); },
    LinkedHashMap::new));

这不会是treemap,但是您的方法没有声明它返回treemap,只是一个map。如果您真的非常非常需要treemap,我建议您更改签名--但这会很奇怪,因为treemap是按键而不是按值排序的。

完整示例:

import java.util.*;
import java.util.stream.*;

public class Test {
    public static void main(String[] args) throws Exception {
        Map<String, Double> unordered = new HashMap<>();
        unordered.put("a", 10.5);
        unordered.put("b", 5.3);
        unordered.put("c", 12.7);
        unordered.put("d", 6.0);

        Map<String, Double> ordered = orderByDescValue(unordered);
        for (Map.Entry<String, Double> entry : ordered.entrySet()) {
            System.out.println(entry.getKey() + ": " + entry.getValue());
        }
    }

    private static Map<String, Double> orderByDescValue(Map<String, Double> unorderedMap) {
        return unorderedMap.entrySet().stream()
            .sorted(Collections.reverseOrder(Map.Entry.comparingByValue()))
            .collect(Collectors.toMap(
                Map.Entry::getKey,
                Map.Entry::getValue,
                (x, y) -> { throw new IllegalStateException("Unexpected merge request"); },
                LinkedHashMap::new));
    }
}
c: 12.7
a: 10.5
d: 6.0
b: 5.3
private static <K, V extends Comparable<V>> Map<K, V> orderByDescValue(Map<K, V> unorderedMap) {
    return unorderedMap.entrySet().stream()
        .sorted(Collections.reverseOrder(Map.Entry.comparingByValue()))
        .collect(Collectors.toMap(
            Map.Entry::getKey,
            Map.Entry::getValue,
            (x, y) -> { throw new IllegalStateException("Unexpected merge request"); },
            LinkedHashMap::new));
}
 类似资料:
  • 问题内容: 我正在使用map接口从文件中读取,然后将其中的值存储为键值对。文件格式如下 我将从该文件中读取数据并将其存储为键值对,然后将其显示给用户。我的要求是以这种格式显示结果 因此,我需要按值的降序对地图进行排序。这样我就可以将它们显示为我的结果..我已经阅读了有关此内容并找到了以下代码 我希望这将按升序对值进行排序,我只想知道此方法是否正确,或者其他有效方法对我有帮助? 问题答案: 由于您可

  • 我有一个HashMap与作为关键和一个值作为价值。 我的目标是通过降序值对Hashmap进行排序。应在

  • 问题内容: 如何在如下所示的SQLAlchemy查询中使用ORDER BY ? 此查询有效,但以升序返回: 如果我尝试: 然后我得到:。 问题答案: 来自@ jpmc26的用法

  • 问题内容: 如何按降序对列表进行排序? 问题答案: 在一行中,使用: 将函数传递给:

  • 问题内容: 我正在尝试编写一个函数,该函数将测试列表是否按降序排列。到目前为止,这是我所拥有的,但似乎不适用于所有列表。 我使用了列表,它返回了。 我似乎无法弄清楚我的错误在哪里。 问题答案: 您宁可进行反向检查(一旦获得,则返回false

  • 问题内容: 我想编写一个比较器,使我可以按值而不是默认自然顺序对TreeMap进行排序。 我尝试过类似的方法,但无法找出问题所在: 我想我要问的是:我可以Map.Entry通过比较器吗? 问题答案: 你不能对值本身进行排序,因为这违反了规范: 一个Map是还提供了一个总体排序它的键。 但是,使用外部集合,你始终可以根据需要按键,值或什至两者的组合(!!)进行排序。 这是一个通用方法,如果的值为,则