从散列映射中获取5个最高值,同时保留插入顺序

时间:2018-03-24 10:33:01

标签: java sorting dictionary hashmap

我需要从ArrayList中形成大多数重复字符串的字典。如果多个字符串具有相同的频率,则字典索引(值)基于插入顺序。首先插入的是最低的索引。

我有一个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 个答案:

答案 0 :(得分:0)

基本思想是按频率对地图进行排序并获取前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)
            );
}

具有相同频率的字词的插入顺序由Stream#sorted处理,因为它是stable sort。笨拙的部分正在将条目收集到一个索引为值的新有序地图。

如果您提供有关您不明白的具体内容的详细信息,我可以添加进一步的解释。