English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
В этом руководстве мы будем изучать примеры класса TreeMap в Java и его операции.
Класс TreeMap в Java Collection Framework предоставляет реализацию структуры данных в виде дерева.
Он наследуетИнтерфейс NavigableMap.
Чтобы создать TreeMap, нам сначала нужно импортировать пакет java.util.TreeMap. После импорта пакета можно использовать следующие методы для создания TreeMap в Java.
TreeMap<Key, Value> numbers = new TreeMap<>();
В приведенном выше коде мы создали TreeMap под названием numbers без параметров. В этом примере элементы TreeMap отсортированы по自然的 (возрастающей) сортировке.
но мы можем自定义 сортировку элементов, используя интерфейс Comparator. Мы изучим его в более поздней части этого руководства.
Здесь,
Key - уникальный идентификатор, используемый для связывания каждого элемента (значения) в карте
Value - элемент, связанный с ключом в карте
Класс TreeMap предоставляет различные методы, которые позволяют нам выполнять операции над картой.
put() - Вставляет指定的 ключ/значение в мап
putAll() - Вставляет все элементы из заданного мапа в этот мап
putIfAbsent() - Вставляет指定的 ключ/значение в map, если ключ уже существует
Например:
import java.util.TreeMap; class Main { public static void main(String[] args) { // Создание TreeMap с четными числами TreeMap<String, Integer> evenNumbers = new TreeMap<>(); // Использование put() evenNumbers.put("Two", 2); evenNumbers.put("Four", 4); // Использование putIfAbsent() evenNumbers.putIfAbsent("Six", 6); System.out.println("TreeMap с четными числами: " + evenNumbers); // Создание TreeMap чисел TreeMap<String, Integer> numbers = new TreeMap<>(); numbers.put("One", 1); // Использование putAll() numbers.putAll(evenNumbers); System.out.println("Числа TreeMap: " + numbers); } }
результат вывода
TreeMap с четными числами: {Four=4, Six=6, Two=2} Числа TreeMap: {Four=4, One=1, Six=6, Two=2}
1. Использование entrySet(), keySet() и values()
entrySet() - Возвращает набор всех ключ/значение пар (элементов) TreeMap
keySet() - возвращает множество всех ключей TreeMap
values() - возвращает множество всех значений TreeMap
Например:
import java.util.TreeMap; class Main { public static void main(String[] args) { TreeMap<String, Integer> numbers = new TreeMap<>(); numbers.put("One", 1); numbers.put("Two", 2); numbers.put("Three", 3); System.out.println("TreeMap: " + numbers); // использование entrySet() System.out.println("Ключ/Значение карты: " + numbers.entrySet()); // использование keySet() System.out.println("Ключи: " + numbers.keySet()); // использование values() System.out.println("Значения: " + numbers.values()); } }
результат вывода
TreeMap: {One=1, Three=3, Two=2} Ключ/Значение карты: [One=1, Three=3, Two=2] Ключи: [One, Three, Two] Значения: [1, 3, 2]
2. Использование get() и getOrDefault()
get() - возвращает значение, связанное с указанным ключом. Если ключ не найден, возвращает null.
getOrDefault() - возвращает значение, связанное с указанным ключом. Если ключ не найден, возвращает указанное значение по умолчанию.
Например:
import java.util.TreeMap; class Main { public static void main(String[] args) { TreeMap<String, Integer> numbers = new TreeMap<>(); numbers.put("One", 1); numbers.put("Two", 2); numbers.put("Three", 3); System.out.println("TreeMap: " + numbers); // использование get() int value1 = numbers.get("Three"); System.out.println("Использование get(): " + value1); // использование getOrDefault() int value2 = numbers.getOrDefault("Five", 5); System.out.println("Использование getOrDefault(): " + value2); } }
результат вывода
TreeMap: {One=1, Three=3, Two=2} Использование get(): 3 Использование getOrDefault(): 5
Здесь метод getOrDefault() не нашел ключ Five. Поэтому он возвращает указанное значение по умолчанию 5.
remove(key) - возвращает и удаляет элемент из TreeMap, связанный с указанным ключом
remove(key, value) - удаляет элемент из карты, связанный с указанным ключом и значением, и возвращает булево значение
Например:
import java.util.TreeMap; class Main { public static void main(String[] args) { TreeMap<String, Integer> numbers = new TreeMap<>(); numbers.put("One", 1); numbers.put("Two", 2); numbers.put("Three", 3); System.out.println("TreeMap: " + numbers); // имеет метод удаления с одним параметром int value = numbers.remove("Two"); System.out.println("Удаленное значение: " + value); // Метод удаления с двумя параметрами boolean result = numbers.remove("Three", 3); System.out.println("Элемент {Three=3} был удален? " + result); System.out.println("Обновленный TreeMap: "+ numbers) } }
результат вывода
TreeMap: {One=1, Three=3, Two=2} Удаленное значение = 2 Элемент {Three=3} был удален? True Обновленная TreeMap: {One=1}
replace(key, value) - заменяет значение value в указанном маппинге новым значением key
replace(key, old, new) - заменяет старое значение новым только если старое значение уже связано с указанным ключом
replaceAll(function) - заменяет каждый элемент карты с помощью указанного результата function
Например:
import java.util.TreeMap; class Main { public static void main(String[] args) { TreeMap<String, Integer> numbers = new TreeMap<>(); numbers.put("First", 1); numbers.put("Second", 2); numbers.put("Third", 3); System.out.println("Оригинальная TreeMap: " + numbers); // Использование replace() numbers.replace("Second", 22); numbers.replace("Third", 3, 33); System.out.println("TreeMap использует метод replace(): " + numbers); // Использование replaceAll() numbers.replaceAll((ключ, старое_значение) -> старое_значение + 2); System.out.println("TreeMap использует метод replaceAll(): " + numbers); } }
результат вывода
Оригинальная TreeMap: {First=1, Second=2, Third=3} TreeMap использует метод replace(): {First=1, Second=22, Third=33} TreeMap использует метод replaceAll(): {First=3, Second=24, Third=35}
В приведенном выше примере, обратите внимание на предложение
numbers.replaceAll((ключ, старое_значение) -> старое_значение + 2);
Здесь мы передаемлямбда-выражениев качестве параметра.
Метод replaceAll() доступ к всем элементам карты. Затем, он заменяет все элементы новым значением (возвращаемым из лямбда-выражения).
Поскольку класс TreeMap реализует интерфейс NavigableMap, он предоставляет различные методы навигации по элементам TreeMap.
firstKey() - Возвращает первый ключ карты
firstEntry() - Возвращает первое ключ/значение из карты
lastKey() - Возвращает последний ключ карты
lastEntry() - Возвращает последнее ключ/значение из карты
Например:
import java.util.TreeMap; class Main { public static void main(String[] args) { TreeMap<String, Integer> numbers = new TreeMap<>(); numbers.put("First", 1); numbers.put("Second", 2); numbers.put("Third", 3); System.out.println("TreeMap: " + numbers); // Использование метода firstKey() String firstKey = numbers.firstKey(); System.out.println("Первый ключ: " + firstKey); // Использование метода lastKey() String lastKey = numbers.lastKey(); System.out.println("Последний ключ: " + lastKey); // Использование метода firstEntry() System.out.println("Первый элемент: " + numbers.firstEntry()); // Использование метода lastEntry() System.out.println("Последний элемент: " + numbers.lastEntry()); } }
результат вывода
TreeMap: {First=1, Second=2, Third=3} Первый ключ: First Последний ключ: Third Первый элемент: First=1 Последний элемент: Third=3
HigherKey() - Возвращает наименьший ключ из ключей, больших чем указанный.
HigherEntry() - Возвращает запись, связанную с наименьшим ключом из ключей, больших чем указанный.
lowerKey() - Возвращает наибольший ключ из ключей, меньших чем указанный.
lowerEntry() - Возвращает запись, связанную с наибольшим ключом из ключей, меньших чем указанный.
ceilingKey() - Возвращает наименьший ключ из ключей, больших чем указанный. Если в карте существует ключ, переданный в качестве параметра, он возвращает этот ключ.
ceilingEntry() - Возвращает запись, связанную с наименьшим ключом из ключей, больших чем указанный. Если в карте существует запись, связанная с переданным ключом аргумента, она возвращает запись, связанную с этим ключом.
floorKey() - Возвращает наибольший ключ из ключей, меньших чем указанный. Если существует ключ, переданный в качестве параметра, он возвращает этот ключ.
floorEntry() - Возвращает запись, связанную с наибольшим ключом, который меньше указанного ключа. Если ключ, переданный в качестве параметра, существует, он возвращает этот ключ.
Например:
import java.util.TreeMap; class Main { public static void main(String[] args) { TreeMap<String, Integer> numbers = new TreeMap<>(); numbers.put("First", 1); numbers.put("Second", 5); numbers.put("Third", 4); numbers.put("Fourth", 6); System.out.println("TreeMap: " + numbers); // Использование higher() System.out.println("Использование higherKey(): " + numbers.higherKey("Fourth")); System.out.println("Использование higherEntry(): " + numbers.higherEntry("Fourth")); // Использование lower() System.out.println("\nИспользование lowerKey(): " + numbers.lowerKey("Fourth")); System.out.println("Использование lowerEntry(): " + numbers.lowerEntry("Fourth")); // Использование ceiling() System.out.println("\nИспользование ceilingKey(): " + numbers.ceilingKey("Fourth")); System.out.println("Использование ceilingEntry(): " + numbers.ceilingEntry("Fourth")); // Использование floor() System.out.println("\nИспользование floorKey(): " + numbers.floorKey("Fourth")); System.out.println("Использование floorEntry(): " + numbers.floorEntry("Fourth")); } }
результат вывода
TreeMap: {First=1, Fourth=6, Second=5, Third=4} Использование higherKey(): Second Использование higherEntry(): Second=5 Использование lowerKey(): First Использование lowerEntry(): First=1 Использование ceilingKey(): Fourth Использование ceilingEntry(): Fourth=6 Использование floorkey(): Fourth Использование floorEntry(): Fourth=6
pollFirstEntry() - возвращает и удаляет запись, связанную с первым ключом в карте
pollLastEntry() - возвращает и удаляет запись, связанную с последним ключом в карте
Например:
import java.util.TreeMap; class Main { public static void main(String[] args) { TreeMap<String, Integer> numbers = new TreeMap<>(); numbers.put("First", 1); numbers.put("Second", 2); numbers.put("Third", 3); System.out.println("TreeMap: " + numbers); // Использование метода pollFirstEntry() System.out.println("Использование pollFirstEntry(): "+ numbers.pollFirstEntry()) // Использование метода pollLastEntry() System.out.println("Использование pollLastEntry(): "+ numbers.pollLastEntry()) System.out.println("Обновленный TreeMap: "+ numbers) } }
результат вывода
TreeMap: {First=1, Second=2, Third=3} Использование pollFirstEntry(): First=1 Использование pollLastEntry(): Third=3 Обновленный TreeMap: {Second=2}
headMap(key,booleanValue)
Метод headMap() возвращает все ключ/значение пар перед указанным ключом Key (переданным в качестве параметра).
Параметр booleanValue является опциональным. Значение по умолчанию false.
Если booleanValue равно true, то该方法 также включает ключ/значение для указанного ключа.
Например:
import java.util.TreeMap; class Main { public static void main(String[] args) { TreeMap<String, Integer> numbers = new TreeMap<>(); numbers.put("First", 1); numbers.put("Second", 2); numbers.put("Third", 3); numbers.put("Fourth", 4); System.out.println("TreeMap: " + numbers); System.out.println("\nИспользование метода headMap():") // Использование headMap() с默认ным booleanValue как false System.out.println("Не указан булево значение: "+ numbers.headMap("Fourth")) // Использование headMap() с указанным booleanValue как true System.out.println("Указан булево значение true: "+ numbers.headMap("Fourth", true)) } }
результат вывода
TreeMap: {First=1, Fourth=4, Second=2, Third=3} Использование метода headMap() Не указан булево значение: {First=1} Указанное значение булева true: {First=1, Fourth=4}
tailMap(key, booleanValue)
Метод tailMap() начинает возвращать все ключ/значки из дерева начиная с указанного ключа (переданного в качестве параметра).
booleanValue является опциональным параметром. Стандартное значение составляет true.
Если booleanValue равен false, то该方法 не включает ключ/значок для указанного ключа.
Например:
import java.util.TreeMap; class Main { public static void main(String[] args) { TreeMap<String, Integer> numbers = new TreeMap<>(); numbers.put("First", 1); numbers.put("Second", 2); numbers.put("Third", 3); numbers.put("Fourth", 4); System.out.println("TreeMap: " + numbers); System.out.println("\nИспользование метода tailMap():"); // Использование метода tailMap() со стандартным значением true System.out.println("booleanValue использует стандартное значение true: " + numbers.tailMap("Second")); // Использование метода tailMap() с указанным значением false System.out.println("booleanValue использует указанное значение false: " + numbers.tailMap("Second", false)); } }
результат вывода
TreeMap: {First=1, Fourth=4, Second=2, Third=3} Использование метода tailMap(): booleanValue использует стандартное значение true: {Second=2, Third=3} booleanValue использует указанное значение false: {Third=3}
subMap(k1, bV1, k2, bV2)
Метод subMap() возвращает все элементы, связанные с ключами между k1 и k2, включая элемент k1.
bV1 и bV2 являются опциональными булевыми параметрами. Стандартное значение bV1 составляет true, а стандартное значение bV2 составляет false.
Если bV1 равен false, то该方法 возвращает все элементы, связанные с ключами между k1 и k2, но не включая элемент k1.
Если bV2 равен true, то该方法 возвращает все элементы, связанные с ключами между k1 и k2, включая элемент k2.
Например:
import java.util.TreeMap; class Main { public static void main(String[] args) { TreeMap<String, Integer> numbers = new TreeMap<>(); numbers.put("First", 1); numbers.put("Second", 2); numbers.put("Third", 3); numbers.put("Fourth", 4); System.out.println("TreeMap: " + numbers); System.out.println("\nИспользование метода subMap():"); // Использование метода tailMap() с стандартным булевым значением System.out.println("Использование стандартного булева значения: " + numbers.subMap("Fourth", "Third")); } }
результат вывода
Использовать Указать булево значение: {Second=2, Third=3}
Метод | Описание |
---|---|
clone() | Создание дубликата TreeMap |
containsKey() | Поиск указанного ключа в TreeMap и возвращение булевского результата |
containsValue() | Поиск указанного значения в TreeMap и возвращение булевского результата |
size() | Возврат размера TreeMap |
clear() | Удаление всех записей TreeMap |
Во всех приведенных выше примерах элементы TreeMap автоматически сортируются (в порядке возрастания). Однако, мы также можем определить пользовательский порядок ключей.
Для этого нам нужно создать свой класс сравнителя на основе сортировки ключей в TreeMap. Например,
import java.util.TreeMap; import java.util.Comparator; class Main { public static void main(String[] args) { // Создание TreeMap с использованием пользовательского сравнителя TreeMap<String, Integer> numbers = new TreeMap<>(new CustomComparator()); numbers.put("First", 1); numbers.put("Second", 2); numbers.put("Third", 3); numbers.put("Fourth", 4); System.out.println("TreeMap: " + numbers); } // Создание класса сравнителя public static class CustomComparator implements Comparator<String> { @Override public int compare(String number1, String number2) { int value = number1.compareTo(number2); // элементы сортируются в обратном порядке if (value > 0) { return -1; } else if (value < 0) { return 1; } else { return 0; } } } }
результат вывода
TreeMap: {Third=3, Second=2, Fourth=4, First=1}
В примере выше мы создали TreeMap и передали класс CustomComparator в качестве параметра.
класс CustomComparator реализует интерфейс Comparator.
затем перепишите метод compare() в обратном порядке для сортировки элементов.