Карта дерева Java
Карта дерева Java
В этом руководстве мы узнаем о классе Java TreeMap и его операциях с помощью примеров.
TreeMap
Класс платформы коллекций Java обеспечивает реализацию древовидной структуры данных.
Он реализует интерфейс NavigableMap.
<час>
Создание TreeMap
Чтобы создать TreeMap
, мы должны импортировать java.util.TreeMap
пакет первый. Как только мы импортируем пакет, вот как мы можем создать TreeMap
на Java.
TreeMap<Key, Value> numbers = new TreeMap<>();
В приведенном выше коде мы создали TreeMap
названные числа без всяких аргументов. В этом случае элементы в TreeMap
сортируются естественным образом (по возрастанию).
Однако мы можем настроить сортировку элементов с помощью Comparator
интерфейс. Мы узнаем об этом позже в этом руководстве.
Здесь
- Ключ - уникальный идентификатор, используемый для связывания каждого элемента (значения) на карте
- Значение - элементы, связанные ключами на карте
Методы TreeMap
TreeMap
класс предоставляет различные методы, которые позволяют нам выполнять операции на карте.
Вставить элементы в TreeMap
put()
- вставляет указанное сопоставление ключа/значения (запись) в картуputAll()
- вставляет все записи из указанной карты в эту картуputIfAbsent()
- вставляет указанное сопоставление ключа/значения в карту, если указанный ключ отсутствует в карте
Например,
import java.util.TreeMap;
class Main {
public static void main(String[] args) {
// Creating TreeMap of even numbers
TreeMap<String, Integer> evenNumbers = new TreeMap<>();
// Using put()
evenNumbers.put("Two", 2);
evenNumbers.put("Four", 4);
// Using putIfAbsent()
evenNumbers.putIfAbsent("Six", 6);
System.out.println("TreeMap of even numbers: " + evenNumbers);
//Creating TreeMap of numbers
TreeMap<String, Integer> numbers = new TreeMap<>();
numbers.put("One", 1);
// Using putAll()
numbers.putAll(evenNumbers);
System.out.println("TreeMap of numbers: " + numbers);
}
}
Вывод
TreeMap of even numbers: {Four=4, Six=6, Two=2} TreeMap of numbers: {Four=4, One=1, Six=6, Two=2}<час>
Доступ к элементам TreeMap
<сильный>1. Использование entrySet(), keySet() и values()
entrySet()
- возвращает набор всех сопоставлений ключей/значений (записей) карты дереваkeySet()
- возвращает набор всех ключей карты дереваvalues()
- возвращает набор всех карт карты дерева
Например,
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);
// Using entrySet()
System.out.println("Key/Value mappings: " + numbers.entrySet());
// Using keySet()
System.out.println("Keys: " + numbers.keySet());
// Using values()
System.out.println("Values: " + numbers.values());
}
}
Вывод
TreeMap: {One=1, Three=3, Two=2} Key/Value mappings: [One=1, Three=3, Two=2] Keys: [One, Three, Two] Values: [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);
// Using get()
int value1 = numbers.get("Three");
System.out.println("Using get(): " + value1);
// Using getOrDefault()
int value2 = numbers.getOrDefault("Five", 5);
System.out.println("Using getOrDefault(): " + value2);
}
}
Вывод
TreeMap: {One=1, Three=3, Two=2} Using get(): 3 Using getOrDefault(): 5
Здесь getOrDefault()
метод не находит ключ пять . Следовательно, он возвращает указанное значение по умолчанию 5. .
Удалить элементы TeeMap
remove(key)
- возвращает и удаляет запись, связанную с указанным ключом, из TreeMapremove(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);
// remove method with single parameter
int value = numbers.remove("Two");
System.out.println("Removed value: " + value);
// remove method with two parameters
boolean result = numbers.remove("Three", 3);
System.out.println("Is the entry {Three=3} removed? " + result);
System.out.println("Updated TreeMap: " + numbers);
}
}
Вывод
TreeMap: {One=1, Three=3, Two=2} Removed value = 2 Is the entry {Three=3} removed? True Updated TreeMap: {One=1}<час>
Заменить элементы TreeMap
replace(key, value)
- заменяет значение, отображаемое указанным ключом с новым значениемreplace(key, old, new)
- заменяет старое значение новым значением, только если старое значение уже связано с указанным ключомreplaceAll(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("Original TreeMap: " + numbers);
// Using replace()
numbers.replace("Second", 22);
numbers.replace("Third", 3, 33);
System.out.println("TreeMap using replace: " + numbers);
// Using replaceAll()
numbers.replaceAll((key, oldValue) -> oldValue + 2);
System.out.println("TreeMap using replaceAll: " + numbers);
}
}
Вывод
Original TreeMap: {First=1, Second=2, Third=3} TreeMap using replace(): {First=1, Second=22, Third=33} TreeMap using replaceAll(): {First=3, Second=24, Third=35}
В приведенной выше программе обратите внимание на оператор
numbers.replaceAll((key, oldValue) -> oldValue + 2);
Здесь мы передали лямбда-выражение в качестве аргумента.
replaceAll()
метод получает доступ ко всем записям карты. Затем он заменяет все элементы новыми значениями (возвращенными из лямбда-выражения).
Способы навигации
Поскольку TreeMap
класс реализует NavigableMap
, он предоставляет различные методы для навигации по элементам карты дерева.
1. Первый и последний методы
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);
// Using the firstKey() method
String firstKey = numbers.firstKey();
System.out.println("First Key: " + firstKey);
// Using the lastKey() method
String lastKey = numbers.lastKey();
System.out.println("Last Key: " + lastKey);
// Using firstEntry() method
System.out.println("First Entry: " + numbers.firstEntry());
// Using the lastEntry() method
System.out.println("Last Entry: " + numbers.lastEntry());
}
}
Вывод
TreeMap: {First=1, Second=2, Third=3} First Key: First Last Key: Third First Entry: First=1 Last Entry: Third=3<час>
2. Потолок, пол, верхний и нижний методы
- более высокий ключ() - Возвращает наименьший ключ среди тех ключей, которые больше указанного ключа.
- вышеВход() - Возвращает запись, связанную с ключом, который является наименьшим среди всех ключей, превышающих указанный ключ.
- нижний ключ() - Возвращает наибольший ключ среди всех тех ключей, которые меньше указанного ключа.
- нижняя запись() - Возвращает запись, связанную с ключом, который является наибольшим среди всех тех ключей, которые меньше указанного ключа.
- потолочный ключ() - Возвращает наименьший ключ среди тех ключей, которые больше указанного ключа. Если ключ, переданный в качестве аргумента, присутствует в карте, он возвращает этот ключ.
- потолокEntry() - Возвращает запись, связанную с наименьшим ключом среди тех ключей, которые больше указанного ключа. Если запись, связанная с ключом, переданным аргументом, присутствует в карте, она возвращает запись, связанную с этим ключом.
- floorKey() - Возвращает наибольший ключ среди тех ключей, которые меньше указанного ключа. Если ключ, переданный в качестве аргумента, присутствует, он возвращает этот ключ.
- этажЭнтри() - Возвращает запись, связанную с ключом, который является наибольшим среди тех ключей, которые меньше указанного ключа. Если ключ, переданный в качестве аргумента, присутствует, он возвращает этот ключ.
Например,
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);
// Using higher()
System.out.println("Using higherKey(): " + numbers.higherKey("Fourth"));
System.out.println("Using higherEntry(): " + numbers.higherEntry("Fourth"));
// Using lower()
System.out.println("\nUsing lowerKey(): " + numbers.lowerKey("Fourth"));
System.out.println("Using lowerEntry(): " + numbers.lowerEntry("Fourth"));
// Using ceiling()
System.out.println("\nUsing ceilingKey(): " + numbers.ceilingKey("Fourth"));
System.out.println("Using ceilingEntry(): " + numbers.ceilingEntry("Fourth"));
// Using floor()
System.out.println("\nUsing floorKey(): " + numbers.floorKey("Fourth"));
System.out.println("Using floorEntry(): " + numbers.floorEntry("Fourth"));
}
}
Вывод
TreeMap: {First=1, Fourth=6, Second=5, Third=4} Using higherKey(): Second Using higherEntry(): Second=5 Using lowerKey(): First Using lowerEntry(): First=1 Using ceilingKey(): Fourth Using ceilingEntry(): Fourth=6 Using floorkey(): Fourth Using floorEntry(): Fourth=6<час>
3. Методы pollFirstEntry() и pollLastEntry()
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);
//Using the pollFirstEntry() method
System.out.println("Using pollFirstEntry(): " + numbers.pollFirstEntry());
// Using the pollLastEntry() method
System.out.println("Using pollLastEntry(): " + numbers.pollLastEntry());
System.out.println("Updated TreeMap: " + numbers);
}
}
Вывод
TreeMap: {First=1, Second=2, Third=3} Using pollFirstEntry(): First=1 Using pollLastEntry(): Third=3 Updated TreeMap: {Second=2}<час>
4. Методы headMap(), tailMap() и subMap()
headMap(ключ, логическое значение)
headMap()
метод возвращает все пары ключ/значение карты дерева до указанного key (который передается в качестве аргумента).
логическое значение параметр является необязательным. Его значение по умолчанию — false
. .
Если true
передается как booleanValue , метод также включает пару ключ/значение key
который передается в качестве аргумента.
Например,
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("\nUsing headMap() Method:");
// Using headMap() with default booleanValue
System.out.println("Without boolean value: " + numbers.headMap("Fourth"));
// Using headMap() with specified booleanValue
System.out.println("With boolean value: " + numbers.headMap("Fourth", true));
}
}
Вывод
TreeMap: {First=1, Fourth=4, Second=2, Third=3} Using headMap() Method: Without boolean value: {First=1} With boolean value: {First=1, Fourth=4}
tailMap(ключ, логическое значение)
tailMap()
метод возвращает все пары ключ/значение карты дерева, начиная с указанного key (который передается в качестве аргумента).
логическое значение является необязательным параметром. Его значение по умолчанию — true
. .
Если false
передается как booleanValue , метод не включает пару ключ/значение указанного key
.
Например,
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("\nUsing tailMap() Method:");
// Using tailMap() with default booleanValue
System.out.println("Without boolean value: " + numbers.tailMap("Second"));
// Using tailMap() with specified booleanValue
System.out.println("With boolean value: " + numbers.tailMap("Second", false));
}
}
Вывод
TreeMap: {First=1, Fourth=4, Second=2, Third=3} Using tailMap() Method: Without boolean value: {Second=2, Third=3} With boolean value: {Third=3}
подкарта(k1, bV1, k2, bV2)
subMap()
метод возвращает все записи, связанные с ключами между k1 и k2 включая запись k1 .
bV1 и bV2 необязательные логические параметры. Значение по умолчанию bV1 это true
и значение по умолчанию bV2 это false
.
Если false
передается как bV1 , метод возвращает все записи, связанные с ключами между k1 и k2 без включения записи k1 .
Если true
передается как bV2 , метод возвращает все записи, связанные с ключами между 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("\nUsing subMap() Method:");
// Using subMap() with default booleanValue
System.out.println("Without boolean value: " + numbers.subMap("Fourth", "Third"));
// Using subMap() with specified booleanValue
System.out.println("With boolean value: " + numbers.subMap("Fourth", false, "Third", true));
}
}
Вывод
TreeMap: {First=1, Fourth=2, Second=2, Third=3} Using subMap() Method: Without boolean value: {Fourth=4, Second=2} With boolean value: {Second=2, Third=3}<час>
Другие методы TreeMap
Метод | Описание |
---|---|
clone() | Создает копию TreeMap |
containsKey() | Ищет TreeMap для указанного ключа и возвращает логический результат |
containsValue() | Ищет TreeMap для указанного значения и возвращает логический результат |
size() | Возвращает размер TreeMap |
clear() | Удаляет все записи из TreeMap |
Компаратор TreeMap
Во всех приведенных выше примерах элементы карты дерева сортируются естественным образом (в порядке возрастания). Однако мы также можем настроить порядок ключей.
Для этого нам нужно создать собственный класс компаратора на основе того, какие ключи в древовидной карте сортируются. Например,
import java.util.TreeMap;
import java.util.Comparator;
class Main {
public static void main(String[] args) {
// Creating a treemap with a customized comparator
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);
}
// Creating a comparator class
public static class CustomComparator implements Comparator<String> {
@Override
public int compare(String number1, String number2) {
int value = number1.compareTo(number2);
// elements are sorted in reverse order
if (value > 0) {
return -1;
}
else if (value < 0) {
return 1;
}
else {
return 0;
}
}
}
}
Вывод
TreeMap: {Third=3, Second=2, Fourth=4, First=1}
В приведенном выше примере мы создали карту дерева, передав CustomComparator. класс в качестве аргумента.
Пользовательский компаратор класс реализует Comparator
интерфейс.
Затем мы переопределяем compare()
метод для сортировки элементов в обратном порядке.
Чтобы узнать больше, посетите Java Comparator (официальная документация по Java).
java