我有一个HashMap,其中键是一个单词,值是文本中该字符串出现的次数。现在我想将这个HashMap减少到只有15个最常用的单词(出现次数最多)。你有任何想法有效地做到这一点吗?
答案 0 :(得分:3)
使用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) );
}
}
}
编辑反向排序顺序
答案 1 :(得分:2)
我想要解决这个问题的一种方法,但可能不是大多数效率,是:
hashMap.entrySet().toArray(new Entry[]{})
。Arrays.sort
对此进行排序,创建您自己的Comparator
,它只会在Entry.getValue()
(将其转换为整数)上进行比较。使其顺序递减,即最高/最高,最低/最低。答案 2 :(得分:0)
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());
}
使用地图的前15个条目。或者修改最后4行,只将15个条目放入地图
答案 3 :(得分:-1)
您可以使用LinkedHashMap并删除最近最少使用的项目。