在HashMap中获取最常用键的有效方法 - Java

时间:2010-03-13 17:42:46

标签: java hashmap

我有一个HashMap,其中键是一个单词,值是文本中该字符串出现的次数。现在我想将这个HashMap减少到只有15个最常用的单词(出现次数最多)。你有任何想法有效地做到这一点吗?

4 个答案:

答案 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()(将其转换为整数)上进行比较。使其顺序递减,即最高/最高,最低/最低。
  • 对已排序的数组进行迭代,并在达到第15个值时中断。

答案 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并删除最近最少使用的项目。