Автор оригинала: Pankaj Kumar.
Java SortedMap-это Карта
, которая обеспечивает полное упорядочение по своим ключам.
Java-карта сортировки
Java SortedMap может быть упорядочен либо в соответствии с естественным порядком его ключей, либо путем предоставления Компаратора
при создании карты.
Если мы не предоставляем никакого Компаратора
(который должен принимать ключ карты) при создании SortedMap, все ключевые элементы карты должны иметь сопоставимый интерфейс для обеспечения упорядочения.
Конструкторы Java SortedMap
В соответствии со спецификацией все классы реализации отсортированных карт общего назначения должны содержать следующие стандартные конструкторы:
- Конструктор void (без аргументов): Он должен создать отсортированную карту, которая сортируется в соответствии с естественным порядком ее ключей.
- Конструктор с аргументом типа Comparator: Он должен создать отсортированную карту, ключи которой отсортированы в соответствии с указанным компаратором.
- Конструктор с аргументом типа Map: Он должен создать отсортированную карту с элементами предоставленной карты, которая сортируется в соответствии с естественным порядком ее ключей.
- Конструктор с аргументом типа SortedMap: Он должен вести себя как конструктор копирования и создавать новую отсортированную карту с теми же элементами и тем же порядком предоставленной отсортированной карты.
Конечно, выполнить эти рекомендации невозможно, поскольку интерфейсы не могут указывать конструкторы в отличие от методов.
Реализация Java SortedMap
Древовидная карта
является широко используемой реализацией SortedMap
. Давайте создадим его экземпляры, используя различные конструкторы, упомянутые выше:
SortedMappersonMap = new TreeMap<>(); personMap.put("Dan Brown", new PersonalDetails("Writer", LocalDate.of(1964, 6, 22), "New Hampshire")); personMap.put("Ayn Rand", new PersonalDetails("Writer", LocalDate.of(1905, 2, 2), "Saint Petersburg")); personMap.put("Devdutt Pattanaik", new PersonalDetails("Mythologist", LocalDate.of(1970, 12, 11), "Mumbai")); personMap.keySet().forEach(key -> { System.out.println(key + " -> " + personMap.get(key)); });
Персональные данные
реализация:
package com.journaldev.sortedmap; import java.time.LocalDate; class PersonalDetails { String occupation; LocalDate dataOfBirth; String city; public PersonalDetails(String occupation, LocalDate dataOfBirth, String city) { this.occupation = occupation; this.dataOfBirth = dataOfBirth; this.city = city; } @Override public String toString() { return this.occupation + ", from " + this.city; } }
Он распечатает карту в соответствии с естественным порядком ее ключей. В этом случае типом ключа является Строка
, которая реализует Сопоставимый
интерфейс.
Вместо конструктора без аргументов, если мы предоставим реализацию Comparator
в аргументе конструктора, выходные данные будут иметь другой порядок. Давайте напишем лямбда-выражение для обеспечения compareTo
реализации Comparator
интерфейса. Допустим, мы хотим отсортировать ключи по длине ключей в порядке убывания:
SortedMappersonMap = new TreeMap<>((s1, s2) -> s2.length() - s1.length());
В этом случае результат будет таким, как показано ниже.
Devdutt Pattanaik -> Mythologist, from Mumbai Dan Brown -> Writer, from New Hampshire Ayn Rand -> Writer, from Saint Petersburg
Теперь мы создадим отсортированную карту, передав другой объект карты или другую отсортированную карту.
Mapmap = new HashMap<>(); map.put("Dan Brown", new PersonalDetails("Writer", LocalDate.of(1964, 6, 22), "New Hampshire")); map.put("Ayn Rand", new PersonalDetails("Writer", LocalDate.of(1905, 2, 2), "Saint Petersburg")); map.put("Devdutt Pattanaik", new PersonalDetails("Mythologist", LocalDate.of(1970, 12, 11), "Mumbai")); SortedMap sortedMap = new TreeMap<>(map); sortedMap.keySet().forEach(key -> { System.out.println(key + " -> " + sortedMap.get(key)); }); System.out.println("\nSorted Map constructed using another sorted map:"); SortedMap copiedMap = new TreeMap<>(sortedMap); copiedMap.keySet().forEach(key -> { System.out.println(key + " -> " + copiedMap.get(key)); });
Выход:
Ayn Rand -> Writer, from Saint Petersburg Dan Brown -> Writer, from New Hampshire Devdutt Pattanaik -> Mythologist, from Mumbai Sorted Map constructed using another sorted map: Ayn Rand -> Writer, from Saint Petersburg Dan Brown -> Writer, from New Hampshire Devdutt Pattanaik -> Mythologist, from Mumbai