Эффективный способ получить наиболее используемые ключи в HashMap - Java - PullRequest
3 голосов
/ 13 марта 2010

У меня есть HashMap, где ключ - это слово, а значение - количество вхождений этой строки в текст. Теперь я хотел бы уменьшить этот HashMap только до 15 наиболее часто используемых слов (с наибольшим количеством вхождений). Есть ли у вас идеи сделать это эффективно?

Ответы [ 4 ]

3 голосов
/ 13 марта 2010

Использование массива вместо ArrayList в соответствии с предложением Pindatjuh может быть лучше,

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) );
            }

        }
    }

РЕДАКТИРОВАТЬ обратный порядок сортировки

2 голосов
/ 13 марта 2010

Один из способов решения этой проблемы, но, вероятно, не самый эффективный , это:

  • Создать массив hashMap.entrySet().toArray(new Entry[]{}).
  • Сортируйте это, используя Arrays.sort, создайте свой собственный Comparator, который будет сравниваться только с Entry.getValue() (который приводит его к целому числу) Сделайте заказ по убыванию, то есть сначала самое большее / самое высокое, меньше / самое низкое.
  • Перебирать отсортированный массив и прерывать, когда вы достигнете 15-го значения.
0 голосов
/ 13 марта 2010
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 записей в карту

0 голосов
/ 13 марта 2010

Вы можете использовать LinkedHashMap и удалять наименее использованные элементы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...