Рубрики
Без рубрики

Карта деревьев Java – Карта деревьев на Java

Карта деревьев Java, карта деревьев в Java, пример карты деревьев Java, карта деревьев против хэш-карты, примеры навигационных карт, пример компаратора карт деревьев, сортировка, код примеров подкарты.

Автор оригинала: Pankaj Kumar.

Древовидная карта Java является одной из реализаций карты и является частью платформы Java Collections.

Древовидная карта Java

Некоторые из важных моментов, которые следует помнить о карте деревьев в java, заключаются в следующем;

  1. Помимо реализации интерфейса карты, Java TreeMap также реализует навигационную карту и косвенно реализует Сортированную карту | интерфейс . Древовидная карта также расширяет Абстрактную карту класс. Записи древовидной карты сортируются в естественном порядке ее ключей. Он также предоставляет конструктор для предоставления
  2. Компаратора , который будет использоваться для заказа. Поэтому, если вы используете какой-либо класс в качестве ключа, убедитесь, что он реализует сопоставимый интерфейс для естественного упорядочения. Ознакомьтесь с вопросами для интервью с коллекциями java , чтобы понять важность этих методов. Реализация Java TreeMap обеспечивает гарантированную стоимость регистрации(n) времени для операций containsKey, get, put и remove.
  3. Древовидная карта не синхронизирована и, следовательно, не является потокобезопасной. Для многопоточных сред вы можете синхронизировать обернутый файл с помощью
  4. Коллекций.Метод synchronizedSortedMap . Методы древовидной карты для получения набора ключей и значений возвращают
  5. Итератор , которые по своей природе быстры к сбою, поэтому любая параллельная модификация приведет к исключению ConcurrentModificationException . Древовидная карта в java не допускает нулевых ключей, однако вы можете иметь несколько нулевых значений, связанных с разными ключами.

Пример карты деревьев Java

Давайте посмотрим на пример программы java TreeMap, чтобы увидеть ее естественную сортировку в действии.

package com.journaldev.java;

import java.util.Comparator;
import java.util.Map;
import java.util.TreeMap;

public class JavaTreeMapExample {

	public static void main(String[] args) {
		
		Map map = new TreeMap<>();
		
		map.put(10, "10");
		map.put(1, "1");
		map.put(5, "5");
		
		System.out.println(map);
		
		map = new TreeMap<>(new Comparator() {

			@Override
			public int compare(Integer x, Integer y) {
				return (x > y) ? -1 : ((x == y) ? 0 : 1);
			}
			
		});
		map.put(10, "10");
		map.put(1, "1");
		map.put(5, "5");
		System.out.println(map);

	}

}

Это приведет к снижению производительности.

{1=1, 5=5, 10=10}
{10=10, 5=5, 1=1}

Обратите внимание, что когда мы не предоставляем компаратор при создании карты деревьев, он использует метод Integer compareTo для упорядочения ключей. Вот почему ключи находятся в порядке возрастания, даже если мы вставляем их в любом порядке.

В следующий раз мы предоставим реализацию компаратора для изменения порядка, и он будет использоваться в TreeMap. Таким образом, ключи хранятся в порядке убывания.

Для простоты я предоставляю анонимную реализацию класса Comparator выше, мы можем использовать лямбда-выражения, чтобы сделать то же самое в одной строке.

map = new TreeMap<>((x,y) -> {return (x > y) ? -1 : ((x == y) ? 0 : 1);});

Древовидная карта против хэш-карты

Древовидная карта и хэш-карта реализуют интерфейс карты и являются частью структуры сбора данных. Давайте рассмотрим некоторые различия между картой деревьев и хэш-картой.

  1. Записи на карте деревьев сортируются в естественном порядке ключей, в то время как HashMap не хранит записи в любом порядке.
  2. Древовидная карта не допускает нулевой ключ, в то время как у нас может быть один нулевой ключ в HashMap.
  3. Поскольку TreeMap хранит записи в отсортированном виде, это немного медленнее, чем HashMap при хранении и извлечении объектов.
  4. TreeMap использует реализацию навигационной карты на основе красно-черного дерева, в то время как HashMap использует реализацию алгоритма хеширования.
  5. TreeMap реализует навигационную карту, поэтому вы получаете некоторые дополнительные функции, которых нет в HashMap. Например – подкарта, первый ключ, последний ключ, карта головы, карта хвоста и т.д.

Когда использовать карту деревьев в Java

Большую часть времени HashMap будет достаточно для использования в качестве реализации карты в вашей программе. Но если у вас есть какие-то особые требования, связанные с сортировкой, поиском следующего нижнего и верхнего ключа, работой над подкартой, тогда вы можете перейти к карте деревьев.

Давайте рассмотрим простой пример программы на карте деревьев, показывающий использование методов навигационной карты.

package com.journaldev.java;

import java.util.Map;
import java.util.Map.Entry;
import java.util.TreeMap;

public class JavaTreeMapNavigationExamples {

	public static void main(String[] args) {
		
		//we have to define object as TreeMap to use NavigableMap functions
		TreeMap map = new TreeMap<>();
		for(int i=0;i<10;i++) {
			map.put(i, i+"");
		}
		
		System.out.println(map);
		
		//find id closest to 5, lower and higher
		Entry entry = map.lowerEntry(5);
		System.out.println("Closest Lower key than 5 is "+entry);
		entry = map.higherEntry(5);
		System.out.println("Closest Higher key than 5 is "+entry);
		
		System.out.println("Closest Lower key than 4 is "+map.lowerKey(4));
		
		entry = map.floorEntry(5);
		System.out.println("Closest floor entry than 5 is "+entry);
		
		entry = map.ceilingEntry(4);
		System.out.println("Closest ceiling key than 4 is "+entry);
		
		entry = map.firstEntry();
		System.out.println("First Entry is "+entry);

		entry = map.lastEntry();
		System.out.println("Last Entry is "+entry);
		
		Map reversedMap = map.descendingMap();
		System.out.println("Reversed Map: "+reversedMap);
		
		//poll and remove first, last entries
		entry = map.pollFirstEntry();
		System.out.println("First Entry is "+entry);
		entry = map.pollLastEntry();
		System.out.println("Last Entry is "+entry);
		System.out.println("Updated Map: "+map);
		
		//submap example
		Map subMap = map.subMap(2, true, 6, true);
		System.out.println("Submap: "+subMap);
		
		subMap = map.headMap(5, true);
		System.out.println("HeadMap: "+subMap);

		subMap = map.tailMap(5, true);
		System.out.println("TailMap: "+subMap);
	}

}

Когда мы выполняем вышеприведенный пример программы TreeMap, она выдает следующий результат.

{0=0, 1=1, 2=2, 3=3, 4=4, 5=5, 6=6, 7=7, 8=8, 9=9}
Closest Lower key than 5 is 4=4
Closest Higher key than 5 is 6=6
Closest Lower key than 4 is 3
Closest floor entry than 5 is 5=5
Closest ceiling key than 4 is 4=4
First Entry is 0=0
Last Entry is 9=9
Reversed Map: {9=9, 8=8, 7=7, 6=6, 5=5, 4=4, 3=3, 2=2, 1=1, 0=0}
First Entry is 0=0
Last Entry is 9=9
Updated Map: {1=1, 2=2, 3=3, 4=4, 5=5, 6=6, 7=7, 8=8}
Submap: {2=2, 3=3, 4=4, 5=5, 6=6}
HeadMap: {1=1, 2=2, 3=3, 4=4, 5=5}
TailMap: {5=5, 6=6, 7=7, 8=8}

Все вышеперечисленные операции понятны сами по себе, пожалуйста, ознакомьтесь с официальной документацией или прокомментируйте здесь, если вас смущает что-либо из этого.

Это все для краткого обзора древовидной карты на java, надеюсь, вам понравилось ее читать.

Ссылки: Официальная документация по API