我需要从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),
}
在网上搜索很长时间但无法理解我该怎么做。
感谢。
答案 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。笨拙的部分正在将条目收集到一个索引为值的新有序地图。
如果您提供有关您不明白的具体内容的详细信息,我可以添加进一步的解释。