2016-07-20 9 views
-4

У меня есть два HashMaps:Как сортировать два HashMaps имеющего одинаковые ключи, но разные значения

Map<String,Integer> map1 = {"One"= 1245598 , "two" = 0 ,"three" =1}; 
Map<String,Boolean> map2 = {"One" =true , "two" =false ,"three" = true}; 

, где «один», «два» являются атрибутами.

Я отсортировал первую карту легко, что map<String,Integer>. Но как я могу сортировать свою вторую карту на основе первой карты, так что метод сортировки возвратит мне карту, которая будет выглядеть как:

map2= {"One" =true , "three" = true ,"two" = false}; 

т.е. в порядке убывания.

+0

Как вы отсортировали «HashMap»? Они неупорядочены, поэтому это бессмысленно.Каков был порядок сортировки для map1? Как «один», «три», «два» «спускаются»? Они выглядят довольно неупорядоченными для меня. – Andreas

+0

В чем смысл «сортировать мою вторую карту на основе первой карты» на основе ключей, значений или чего-то другого? – ead

ответ

0

Вместо использования HashMap используйте TreeMap. Это сортирует ваши карты.

Вы можете передать эти ссылки: LINK 1 или link 2

Map<String, Integer> treeMap1 = new TreeMap<String, Integer>(
      new Comparator<String>() { 

      @Override 
      public int compare(String o1, String o2) { 
       return o2.compareTo(o1); 
      } 

     }); 
     treeMap1.putAll(map1); 

Аналогично, создать второй TreeMap с <String, Boolean>

+0

Дайте мне знать, если у вас есть какие-либо сомнения –

+0

u r говорит сортировать обе карты самостоятельно. Но как я могу сортировать булевую карту на основе карты целочисленной сортировки. Я не понимаю ясно. –

+0

Treemap здесь сортирует карту в соответствии с ключами. Поскольку обе карты имеют одинаковый набор ключей, их отсортированный порядок будет таким же. Вам не нужно сортировать карту2 в соответствии с map1, и вам нужно отдельно сортировать обе карты в одном порядке. Это делается компаратором tremap. –

1

Map s неотъемлемо НЕСОРТИРОВАННАЯ. Тот факт, что первая карта сортируется, просто случайно. Например.

Map<String, Integer> map1 = new HashMap<>(); 
map1.put("Four", 4); 
map1.put("One", 1245598); 
map1.put("two", 0); 
map1.put("three", 1); 
map1.put("Six", 6); 

приведет

map1={Six=6, Four=4, One=1245598, two=0, three=1} 

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

Map<String, Integer> map1 = new TreeMap<>(); 
map1.put("One", 1245598); 
map1.put("two", 0); 
map1.put("three", 1); 

Map<String,Boolean> map2 = new TreeMap<>(Comparator.comparing(map1::get).reversed()); 
map2.put("One",true); 
map2.put("two", false); 
map2.put("three", true); 

System.out.println("map1="+map1); 
System.out.println("map2="+map2); 

Выход:

map1={One=1245598, three=1, two=0} 
map2={One=true, three=true, two=false} 

Однако обратите внимание, что обновления к первой карте может сломаться второй.


Comparator.comparing(map1::get).reversed() 

только короткий путь, чтобы создать компаратор в Java 8:

Comparator.comparing(func) 

Создает Comparator, который сравнивает 2 объекта путем сравнения результатов применения func к тем объектам, т.е. стоимость, полученная от метода compare(o1, o2) этого Comparator, составляет

func.apply(o1).compareTo(func.apply(o2)) 

map1::get - метод ссылки на метод get от map1. Учитывая значение o1, он вернется map1.get(o1). Сочетание этих 2 фактов возвращаемого типа компаратора, созданный поэтому

map1.get(o1).compareTo(map1.get(o2)) 

comparator.reversed() просто возвращает Comparator для обратной последовательности для заказа вместо сортировки по возрастанию по убыванию.

+0

как вы используете сравнение (map: get) .Can u pls объясняет это правильно –

+0

@SukirtiShukla: Добавлено некоторое объяснение. Если вы не знакомы с ссылками на методы, вы можете прочитать урок оракула о них: https://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html – fabian

Смежные вопросы