我有一个HashMap,其中键是单词,值是文本中该字符串出现次数。现在我想将此HashMap缩减为仅包含最常用的15个单词(具有最大出现次数)。你有什么高效的方法吗?
我有一个HashMap,其中键是单词,值是文本中该字符串出现次数。现在我想将此HashMap缩减为仅包含最常用的15个单词(具有最大出现次数)。你有什么高效的方法吗?
如Pindatjuh建议的那样,使用数组而不是ArrayList可能更好。
public class HashTest {
public static void main(String[] args) {
class hmComp implements Comparator<Map.Entry<String,Integer>> {
public int compare(Entry<String, Integer> o1,
Entry<String, Integer> o2) {
return o2.getValue() - o1.getValue();
}
}
HashMap<String, Integer> hm = new HashMap<String, Integer>();
Random rand = new Random();
for (int i = 0; i < 26; i++) {
hm.put("Word" +i, rand.nextInt(100));
}
ArrayList list = new ArrayList( hm.entrySet() );
Collections.sort(list, new hmComp() );
for ( int i = 0 ; i < 15 ; i++ ) {
System.out.println( list.get(i) );
}
}
}
编辑倒序排列顺序
我想到一种解决方法,但可能不是最有效的方法:
hashMap.entrySet().toArray(new Entry[]{})
的数组。Arrays.sort
进行排序,并创建你自己的比较器(Comparator),它只会根据 Entry.getValue()
进行比较(将其转换为 Integer 类型)。让它按降序排列,即最高/最多的排在前面,最低/最少的排在后面。Map<String, Integer> map = new HashMap<String, Integer>();
// --- Put entries into map here ---
// Get a list of the entries in the map
List<Map.Entry<String, Integer>> list = new Vector<Map.Entry<String, Integer>>(map.entrySet());
// Sort the list using an annonymous inner class implementing Comparator for the compare method
java.util.Collections.sort(list, new Comparator<Map.Entry<String, Integer>>(){
public int compare(Map.Entry<String, Integer> entry, Map.Entry<String, Integer> entry1)
{
// Return 0 for a match, -1 for less than and +1 for more then
return (entry.getValue().equals(entry1.getValue()) ? 0 : (entry.getValue() > entry1.getValue() ? 1 : -1));
}
});
// Clear the map
map.clear();
// Copy back the entries now in order
for (Map.Entry<String, Integer> entry: list)
{
map.put(entry.getKey(), entry.getValue());
}
使用 map 的前 15 个条目。或者修改后4行代码,将仅放置15个条目到 map 中。
LinkedHashMap
不会更改元素顺序。这样做是行不通的。 - Pindatjuh