我有一個HashMap<String, Integer>
包含單詞及其頻率。我現在需要現在把這個HashMap
轉換成只是字的ArrayList
,丟棄的頻率,但我也希望ArrayList
是按降序排序按字頻。將HashMap轉換爲排序ArrayList
有沒有人知道一個有效的方法來做到這一點?
我有一個HashMap<String, Integer>
包含單詞及其頻率。我現在需要現在把這個HashMap
轉換成只是字的ArrayList
,丟棄的頻率,但我也希望ArrayList
是按降序排序按字頻。將HashMap轉換爲排序ArrayList
有沒有人知道一個有效的方法來做到這一點?
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());
}
您可以:
當使用的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((e1, e2) -> e2.getValue().compareTo(e1.getValue()))
.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
在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)));
這是一個非常標準的要求,你應該很容易能夠在互聯網上找到東西。你有沒有嘗試過嗎? – Michael 2014-11-03 15:32:43
例如,您可以創建一個'Word'類來保存'String'和頻率,並實現'Comparable'接口比較'Word'對象的頻率。然後從'HashMap'填充一個'ArrayList',然後調用'Collections.sort(yourArrayList)' –
nem035
2014-11-03 15:35:48
我最近準備了一些工作。我不知道這是否是最好的解決方案,而是使用'ArrayList',而不是'Map ',其中MyClass包含字符串字和int/。你可以使用'Collections.sort(yourList,new Comparator (){@Override public int compare(MyClass mc1,MyClass mc2){...}});'將其排序 –
2014-11-03 15:36:00