我有HashMap<String, Integer>
个词及其频率。我现在需要将此HashMap
转换为ArrayList
的单词,丢弃频率,但我还希望ArrayList
按降序排序按频率划分的单词。
有谁知道这样做的有效方法?
答案 0 :(得分:6)
HashMap
有一个名为entrySet()
的便捷方法,可让您访问键值对的集合。您可以使用它来构建List<Map.Entry<String,Integer>>
。
现在你有了可以排序的东西。使用带有自定义比较器的排序方法,该比较器将具有较高频率的条目排序到列表的开头。
手头有一个排序列表,你需要做的就是走它,然后收获现在正确顺序的单词。
List<Map.Entry<String,Integer>> entries = new ArrayList<Map.Entry<String,Integer>>(
freqMap.entrySet()
);
Collections.sort(
entries
, new Comparator<Map.Entry<String,Integer>>() {
public int compare(Map.Entry<String,Integer> a, Map.Entry<String,Integer> b) {
return Integer.compare(b.getValue(), a.getValue());
}
}
);
for (Map.Entry<String,Integer> e : entries) {
// This loop prints entries. You can use the same loop
// to get the keys from entries, and add it to your target list.
System.out.println(e.getKey()+":"+e.getValue());
}
答案 1 :(得分:3)
使用 Java 8 时,您可以使用Stream API,如下所示:
final Map<String, Integer> wordStats = new HashMap<>();
// some dummy data:
wordStats.put("twice", 2);
wordStats.put("thrice", 3);
wordStats.put("once", 1);
final List<String> sortedStats = wordStats.entrySet().stream()
.sorted(Comparator.comparing(Map.Entry::getValue, Comparator.reverseOrder()))
.map(Map.Entry::getKey)
.collect(Collectors.toList());
// or to specify the list implementation:
//.collect(ArrayList::new, ArrayList::add, ArrayList::addAll);
// Output
sortedStats.forEach(System.out::println);
<强>输出:强>
thrice
twice
once
答案 2 :(得分:1)
在Java 8中,您还可以对已经回答的内容进行更短的变化
升序
ArrayList<Map.Entry<String, Integer>> sorted = newArrayList<>(frequencies.entrySet());
sorted.sort(Comparator.comparingInt(Map.Entry::getValue));
降序
ArrayList<Map.Entry<String, Integer>> sorted = new ArrayList<>(frequencies.entrySet());
sorted.sort(Collections.reverseOrder(Comparator.comparingInt(Map.Entry::getValue)));
答案 3 :(得分:0)
你可以: