Как распечатать содержимое HashMapв порядке возрастания на основе его значений? - PullRequest
31 голосов
/ 31 августа 2010

У меня есть это HashMap, которое мне нужно распечатать в порядке возрастания в соответствии с значениями , содержащимися в нем ( не ключи ).

Но порядок, когда я его распечатываю, кажется случайным.

Как лучше всего распечатать его в порядке возрастания значений ?

Map<String, String> codes = new HashMap<String, String>();

codes.put("A1", "Aania");
codes.put("X1", "Abatha");
codes.put("C1", "Acathan");
codes.put("S1", "Adreenas");

Другими словами, приведенный выше пример должен распечатываться так:

A1, Aania
X1, Abatha
C1, Acathan
S1, Adreenas

Ответы [ 13 ]

39 голосов
/ 31 августа 2010

Вы не сможете сделать это из одного класса HashMap.

Я бы взял Map<String, String> codes, построил бы обратную карту TreeMap<String, String> reversedMap, где вы сопоставляете значения codes Карты с ключами (для этого потребуется, чтобы ваша исходная Карта имела один-к-одномуодно отображение от ключа к значению).Поскольку TreeMap предоставляет итераторы, которые возвращают записи в порядке возрастания ключа, это даст вам комбинацию значения / ключа первой карты в порядке (отсортированном по значениям), который вы хотите.

Map<String, String> reversedMap = new TreeMap<String, String>(codes);

//then you just access the reversedMap however you like...
for (Map.Entry entry : reversedMap.entrySet()) {
    System.out.println(entry.getKey() + ", " + entry.getValue());
}

Существует несколько коллекцийбиблиотеки (commons-collection, Google Collections и т. д.), имеющие похожие реализации двунаправленной карты.

11 голосов
/ 31 августа 2010

Вам необходимо составить список ключей, отсортировать их по соответствующим значениям, а затем выполнить итерацию по отсортированным ключам.

Map<String, String> map = getMyMap();
List<String> keys = new ArrayList<String>(map.keySet());
Collections.sort(keys, someComparator);
for (String key: keys) {
    System.out.println(key + ": " + map.get(key));
}

Что касается того, что использовать для someComparator, здесьВот некоторые полезные, общие процедуры создания компаратора, которые я часто нахожу полезными.Первый сортирует по значениям в соответствии с их естественным порядком, а второй позволяет вам указать любой произвольный компаратор для сортировки значений:

public static <K, V extends Comparable<? super V>>
        Comparator<K> mapValueComparator(final Map<K, V> map) {
    return new Comparator<K>() {
        public int compare(K key1, K key2) {
            return map.get(key1).compareTo(map.get(key2));
        }
    };
}

public static <K, V>
        Comparator<K> mapValueComparator(final Map<K, V> map,
                                         final Comparator<V> comparator) {
    return new Comparator<K>() {
        public int compare(K key1, K key2) {
            return comparator.compare(map.get(key1), map.get(key2));
        }
    };
}
6 голосов
/ 27 апреля 2015

Пришло время добавить несколько лямбд:

codes.entrySet()
    .stream()
    .sorted(Comparator.comparing(Map.Entry::getValue))
    .forEach(System.out::println);
5 голосов
/ 21 апреля 2016

вам просто нужно использовать:

 Map<>.toString().replace("]","\n");

и заменять конечную квадратную скобку каждого значения ключа = новой строкой.

5 голосов
/ 20 ноября 2012

цикл for для (запись Map.Entry: codes.entrySet()) не работает для меня. Вместо этого использовал Iterator.

Iterator<Map.Entry<String, String>> i = codes.entrySet().iterator(); 
while(i.hasNext()){
    String key = i.next().getKey();
    System.out.println(key+", "+codes.get(key));
}
3 голосов
/ 24 апреля 2017

Java 8

map.entrySet().stream().sorted(Map.Entry.comparingByValue()).forEach(System.out::println);
2 голосов
/ 31 августа 2010
  1. Создать TreeMap<String,String>
  2. Добавьте каждую из HashMap записей со значением в качестве ключа.
  3. итерирование TreeMap

Если значения неуникальные, вам понадобится список во второй позиции.

1 голос
/ 01 сентября 2010

Вы можете использовать список набора записей, а не набор ключей, и это более естественный выбор, если вы сортируете на основе значения.Это позволяет избежать множества ненужных поисков при сортировке и печати записей.

Map<String, String> map = ...
List<Map.Entry<String, String>> listOfEntries = new ArrayList<Map.Entry<String, String>>(map.entrySet());
Collections.sort(listOfEntries, new SortByValueComparator());
for(Map.Entry<String, String> entry: listOfEntries)
   System.out.println(entry);

static class SortByValueComparator implements Comparator<Map.Entry<String, String>> {
   public int compareTo(Map.Entry<String, String> e1, Map.Entry<String, String> e2) {
       return e1.getValue().compateTo(e2.getValue());
   }
}
0 голосов
/ 06 июня 2017

самый простой и короткий код, я думаю, это:

public void listPrinter(LinkedHashMap<String, String> caseList) {

    for(Entry entry:caseList.entrySet()) {
        System.out.println("K: \t"+entry.getKey()+", V: \t"+entry.getValue());
    }
}
0 голосов
/ 27 апреля 2015
while (itr.hasNext()) {
    Vehicle vc=(Vehicle) itr.next();
    if(vc.getVehicleType().equalsIgnoreCase(s)) {
        count++;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...