Получите 3 самых высоких значения с карты - PullRequest
0 голосов
/ 29 ноября 2010

У меня есть Map<String,String>, в котором есть записи типа «User1», «43». Теперь я хочу «Топ-3» из самых высоких значений.

Было бы проще с Map<String,Integer>, но из-за технических ограничений я могу просто взять Карту как <String,String>.

Какой самый эффективный способ преобразовать карту <String,String> в <String,Int> и затем отсортировать ее?

Ответы [ 4 ]

3 голосов
/ 29 ноября 2010

Для преобразования из <String, String> в <String, Integer> вы можете использовать:

 Map<String, Integer> treemap = new HashMap<String, Integer>();
 for (Entry<String, String> entry : entries) {
     treemap.put(entry.getKey(), Integer.parseInt(entry.getValue()));
 }

Однако тогда вам придется повторить карту снова. Если вам не нужна вся карта, а нужна только верхняя тройка, вы можете просто повторить записи и получить тройку лучших для сравнения.

Или вы можете поменять ключ и значение и использовать TreeMap<Integer, String> с Comparator, если вам нужны как верхние элементы, так и целые данные.

1 голос
/ 29 ноября 2010

Вы можете просто поместить значения в список и отсортировать его:

ArrayList<Integer> highest = new ArrayList<Integer>();
for (String value : map.values()) {
    highest.add(Integer.parseInt(value));
}
Collections.sort(highest);
for(int i = highest.size() - 1; i >=0 && i > highest.size()-4; i--){
    System.out.println(highest.get(i));
}

Если карта очень большая, может быть лучше выполнить итерацию по ней и выбрать только 3 самых высоких значения без сортировки всего списка.

1 голос
/ 29 ноября 2010

Есть несколько способов:

  1. Создать SortedMap, например TreeMap с пользовательским -anonymous- Comparator, который выполняет сравнение, просматривая ключи, полученные при вызове метода compare (), со значениями в исходной карте.
  2. Заполните его всеми записями ключа / значения в оригинале с помощью метода addAll ().
  3. Смотреть, как карта сортируется по значению.
  4. Хватай голову / хвост (в зависимости от того, как сортирует твой компаратор)

Аналогично вышеуказанному:

  1. Создать TreeSet ключей с пользовательским компаратором, как указано выше ...
  2. Заполните его набором ключей () исходной карты.
  3. Возьмите набор ключей "голова / хвост".
  4. Создать новую Карту из этих ключей и значение из исходной карты ...
0 голосов
/ 29 ноября 2010

Вы можете перебирать значения карты (с помощью Map.values ​​()), конвертировать каждое в целое число (с помощью Integer.getInteger (String s)) и отслеживать 3 верхних элемента, которые вы видите.

Или, вы можете сделать то же, что и выше, но вместо отслеживания верхних 3, создайте LinkedList и вставляйте каждое целое число в правильное место (проходите по LinkedList, пока не найдете место, где должно быть вставлено целое число).

...