有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java从hashmap中获得5个最高值,同时保留插入顺序

我需要从ArrayList中建立一个最重复字符串的字典。如果多个字符串具有相同的频率,则字典索引(值)基于插入顺序。First inserted的索引最低

我有一个LinkedHashMap,我计算了ArrayList中每个单词出现的频率。像这样的-

{
map.put("abcd1", 7);
map.put("abcd5", 8);
map.put("abcd4", 2);
map.put("abcd3", 10);
map.put("abcd2", 7);
map.put("abcd6", 5);
map.put("abcd7", 8);
}

我需要的是另一个HashMap,它按值排序,如果值相同,则按插入顺序排序。像这样-

{
("abcd3", 0),
("abcd5", 1),
("abcd7", 2),
("abcd1", 3),
("abcd2", 4),
}

在网上搜索了很长时间,但不明白我该怎么做

谢谢


共 (1) 个答案

  1. # 1 楼答案

    其基本思想是按频率对地图进行排序,并获取前5个条目。您可以这样做,例如使用Java 8流:

    public LinkedHashMap<String, Integer> getTop5ByValue(LinkedHashMap<String, Integer> map) {
        AtomicInteger index = new AtomicInteger();
        return map.entrySet().stream()
            .sorted(Entry.<String, Integer> comparingByValue().reversed())
            .limit(5)
            .collect(
                Collectors.toMap(
                    e -> e.getKey(),
                    e -> index.getAndIncrement(),
                    (k, v) -> {
                        throw new IllegalStateException("Duplicate key " + k);
                    },
                    LinkedHashMap::new)
                );
    }
    

    频率相同的单词的插入顺序由^{}处理,因为这是一个stable sort。笨拙的部分是将条目收集到一个以索引为值的新的有序映射

    如果你提供你不明白的细节,我可以补充进一步的解释