Сортировка целых чисел по верхнему и нижнему ключу TreeMap

    Map<Integer, String> map = new TreeMap<Integer, String>();

    // Add Items to the TreeMap
    map.put(new Integer(8), "Eight");
    map.put(new Integer(9), "Nine");
    map.put(new Integer(1), "One");
    map.put(new Integer(4), "Four");
    map.put(new Integer(10), "Ten");
    map.put(new Integer(5), "Five");
    map.put(new Integer(6), "Six");
    map.put(new Integer(2), "Two");
    map.put(new Integer(3), "Three");
    map.put(new Integer(7), "Seven");

    keys = map.keySet();
    for (Iterator i = keys.iterator(); i.hasNext();) {
      Integer key = (Integer) i.next();
      String value = (String) map.get(key);
      System.out.println(key + " = " + value);
    }

Вывод:

  • 1 = один
  • 2 = два
  • 3 = три
  • 4 = четыре
  • 5 = пять
  • 7 = семь
  • 8 = восемь
  • 9 = девять
  • 10 = десять

Я хотел бы изменить этот целочисленный вид TreeMap, чтобы самое высокое целое число было впереди, а самое низкое и в конце. Как я могу это сделать? Заранее спасибо.


person user2803086    schedule 24.07.2014    source источник


Ответы (2)


TreeMap может принимать Comparator вы можете передать пользовательскую реализацию

Измените объявление карты, чтобы передать компаратор обратного порядка

Map<Integer, String> map = new TreeMap<Integer, String>(Collections.reverseOrder());

См. также

person jmj    schedule 24.07.2014
comment
Кажется, это работает «Collections.reverseOrder()», я ничего не знаю о компараторах, но это кажется самым простым решением. - person user2803086; 25.07.2014
comment
Comparator - это интерфейс, который помогает алгоритмам сортировки сравнивать два объекта, например, вы знаете 1 ‹ 2, но для пользовательских объектов, например, Person, как вы определяете, является ли p1 > p2, Comparator помогает там, см. связанный javadoc - person jmj; 25.07.2014

Как насчет

NavigableMap<Integer, String> map = new TreeMap<Integer, String>();

for(Map<Integer, String> entry : map.descendingMap().entrySet())
     System.out.println(entry); // prints key = value
person Peter Lawrey    schedule 24.07.2014
comment
Это кажется самым простым способом, так как мои знания о компараторах близки к нулю. Мой единственный вопрос: зачем использовать NavigableMap, а не TreeMap в начале? - person user2803086; 25.07.2014
comment
@user2803086 user2803086 Считается хорошей практикой использовать абстракции интерфейса более высокого уровня, если доступ к конкретному базовому типу реализации не требуется напрямую в коде. Причина этого в том, что это упрощает изменение типа реализации, если вы захотите сделать это в будущем (и вы не связаны никакими контрактами, требующими типа более низкого уровня). Это ни в коем случае не является обязательным требованием, и на практике может быть редко, что вы фактически измените тип реализации классов коллекций, но хорошая практика есть хорошая практика. - person Trevor Freeman; 25.07.2014
comment
Вы можете заменить TreeMap на ConcurrentSkipListMap или другую такую ​​карту только в одном месте. NavigableMap поясняет, что это минимальное требование. - person Peter Lawrey; 25.07.2014
comment
@increment1 Я знаю, что List лежит в основе ArrayList, но я никогда не знаю, почему. Есть ли какое-то название для этой практики, потому что я, конечно, хочу знать, как это делается. заранее спасибо - person user2803086; 25.07.2014
comment
Если у вас есть List<String> list = new ArrayList<>();, ваш list является ссылкой на все, что реализует List. Это означает, что вы можете использовать любую другую реализацию, не изменяя код, который ее использует. т.е. List<String> list = new CopyOnWriteArrayList<>(); и больше ничего менять не нужно. Это называется наследованием и полиморфизмом. - person Peter Lawrey; 25.07.2014