Elettracompany.com

Компьютерный справочник
4 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Java tree map

HashMap и TreeMap в Java

HashMap и TreeMap являются частью структуры коллекции .

HashMap
Класс java.util.HashMap является реализацией на основе хеширования. В HashMap у нас есть пара ключ-значение .

Давайте рассмотрим ниже пример, где мы должны подсчитать вхождения каждого целого в данном массиве целых чисел.

/ * Java-программа для печати частот всех элементов с использованием

// Эта функция печатает частоты всех элементов

static void printFreq( int arr[])

// Создаем пустой HashMap

// Пройти через данный массив

for ( int i = 0 ; i

Integer c = hmap.get(arr[i]);

// Если это первое вхождение элемента

if (hmap.get(arr[i]) == null )

// Если элементы уже существуют в хэш-карте

for (Map.Entry m:hmap.entrySet())

System.out.println( «Frequency of » + m.getKey() +

// Метод драйвера для проверки вышеуказанного метода

public static void main (String[] args)

Ключевые моменты

  • HashMap не поддерживает какой-либо порядок ни на основе ключа, ни на основе значения. Если мы хотим, чтобы ключи сохранялись в отсортированном порядке, нам нужно использовать TreeMap.
  • Сложность : операции get / put / containsKey () в среднем имеют значение O (1), но мы не можем гарантировать, что все зависит от того, сколько времени потребуется для вычисления хэша.

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

TreeMap
TreeMap может быть немного удобен, когда нам нужно хранить уникальные элементы только в отсортированном порядке. Java.util.TreeMap использует красно-черное дерево на заднем плане, что гарантирует отсутствие дубликатов; кроме того, он также поддерживает элементы в отсортированном порядке.

Ниже приведена реализация той же проблемы на основе TreeMap. Это решение имеет большую временную сложность O (nLogn) по сравнению с предыдущим, которое имеет O (n). Преимущество этого метода в том, что мы получаем элементы в отсортированном порядке.

/ * Java-программа для печати частот всех элементов с использованием

// Эта функция печатает частоты всех элементов

static void printFreq( int arr[])

// Создаем пустой TreeMap

// Пройти через данный массив

for ( int i = 0 ; i

Integer c = tmap.get(arr[i]);

// Если это первое вхождение элемента

if (tmap.get(arr[i]) == null )

// Если элементы уже существуют в хэш-карте

for (Map.Entry m:tmap.entrySet())

System.out.println( «Frequency of » + m.getKey() +

// Метод драйвера для проверки вышеуказанного метода

public static void main (String[] args)

Ключевые моменты

  • Для таких операций, как добавление, удаление, содержит ключ, временная сложность равна O (log n, где n — количество элементов, присутствующих в TreeMap.
  • TreeMap всегда сохраняет элементы в отсортированном (возрастающем) порядке, в то время как элементы в HashMap не имеют порядка. TreeMap также предоставляет несколько интересных методов для первого, последнего, пола и потолка ключей.

Обзор:

  1. HashMap реализует интерфейс Map, а TreeMap реализует интерфейс SortedMap. Интерфейс Sorted Map является дочерним элементом Map.
  2. HashMap реализует хеширование, в то время как TreeMap реализует красно-черное дерево (самобалансирующееся дерево двоичного поиска). Поэтому все различия между хешированием и сбалансированным бинарным деревом поиска применимы здесь.
  3. И HashMap, и TreeMap имеют свои аналоги HashSet и TreeSet. HashSet и TreeSet реализуют интерфейс Set . В HashSet и TreeSet у нас есть только ключ, без значения, они в основном используются, чтобы увидеть наличие / отсутствие в наборе. Для решения вышеуказанной проблемы мы не можем использовать HashSet (или TreeSet), так как мы не можем хранить счетчики. Пример проблемы, когда мы предпочли бы HashSet (или TreeSet), а не HashMap (или TreeMap), состоит в печати всех отдельных элементов в массиве.

Статьи по Теме

Эта статья предоставлена Чирагом Агравалом . Если вам нравится GeeksforGeeks и вы хотите внести свой вклад, вы также можете написать статью и отправить ее по почте на contrib@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.

Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой теме

Java TreeMap class

By Lokesh Gupta | Filed Under: Java Collections

TreeMap in Java is used to store key-value pairs very similar to HashMap class. Difference is that TreeMap provides an efficient way to store key/value pairs in sorted order. It is a red-Black tree based NavigableMap implementation.

In this Java TreeMap tutorial, we will learn about TreeMap class, it’s methods, usecases and other important details.

1. TreeMap Hierarchy

The TreeMap class is declared as following in Java. It extends AbstractMap class and implements NavigableMap interface. Here ‘K’ is the type of keys and ‘V’ is the type of mapped values to keys.

2. TreeMap Features

The important points about Java TreeMap class are:

  • It stores key-value pairs similar to like HashMap.
  • It allows only distinct keys. Duplicate keys are not possible.
  • It cannot have null key but can have multiple null values.
  • It stores the keys in sorted order (natural order) or by a Comparator provided at map creation time.
  • It provides guaranteed log(n) time cost for the containsKey , get , put and remove operations.
  • It is not synchronized. Use Collections.synchronizedSortedMap(new TreeMap()) to work in concurrent environment.
  • The iterators returned by the iterator method are fail-fast.

3. TreeMap Constructors

The TreeMap has five types of constructors:

  1. TreeMap(): creates a new, empty tree map, using the natural ordering of its keys.
  2. TreeMap(Comparator c): creates a new, empty tree map, ordered according to the given comparator.
  3. TreeMap(Map map): creates a new tree map containing the same mappings as the given map, ordered according to the natural ordering of its keys.
  4. TreeMap(SortedMap map): creates a new tree map containing the same mappings and using the same ordering as the specified sorted map.

4. TreeMap Methods

The important methods we should learn about TreeMap are as follows:

  1. void clear(): It removes all the key-value pairs from the map.
  2. void size(): It returns the number of key-value pairs present in this map.
  3. void isEmpty(): It returns true if this map contains no key-value mappings..
  4. boolean containsKey(Object key): It returns ‘true’ if a specified key is present in the map.
  5. boolean containsValue(Object key): It returns ‘true’ if a specified value is mapped to at least one key in the map.
  6. Object get(Object key): It retrieves the value mapped by the specified key , or null if this map contains no mapping for the key.
  7. Object remove(Object key): It removes the key-value pair for the specified key from the map if present.
  8. Comparator comparator(): It returns the comparator used to order the keys in this map, or null if this map uses the natural ordering of its keys.
  9. Object firstKey(): It returns the first (least) key currently in the tree map.
  10. Object lastKey(): It returns the last (greatest) key currently in the tree map.
  11. Object ceilingKey(Object key): It returns the least key greater than or equal to the given key, or null if there is no such key.
  12. Object higherKey(Object key): It returns the least key strictly greater than the specified key.
  13. NavigableMap descendingMap(): It returns a reverse order view of the mappings contained in this map.

5. Java TreeMap Example

5.1. TreeMap Example with Natural Ordering

Java program to demonstrate the usages of TreeMap methods with natual ordering.

Читать еще:  Таблица в javascript

5.2. TreeMap Example with Custom Ordering using Comparator

6. TreeMap Usecases

Whether using default ordering or custom ordering using comparator, TreeMap provides an efficient method to store and retrieve the information contained within in a sorted manner. This makes it excellent tool to be used in scenarios where information needs to displayed in sorted order. For example, employees information based on their age or phone numbers in in any mobile application.

Another useful usecase can be a dictionary where information is recorded and displayed in sorted fashion.

In fact, they are useful any place where the information needs to be sorted and where quick random access is necessary. If random access is not needed then rather use sorted set or list.

7. TreeMap Performance

TreeMap provides the performance of log(n) for most operations like add(), remove() and contains(). HashMap performs with constant-time performance O(1) for same operations. In that way, HashMap performs much better than TreeMap.

TreeMap has better performance in memory management as it does not maintain an array internally to store key-value pairs. In HashMap, array size is determined while initialization or resizing which if is often more than needed at the time. It waste the memory. There is no such problem with TreeMap.

8. Concurrency in TreeMap

Both versions of Map, HashMap and TreeMap aren’t synchronized and the programmer need to manage concurrent access on the maps.

We can get the synchronized view of the treemap explicitly using Collections.synchronizedSortedMap(new TreeMap()).

9. Conclusion

In this tutorial, we learned about Java TreeMap class and it’s internals. We saw how it stores key-value pairs in sorted manner – either in natural ordering (default) or in some custom ordering of keys (using provided comparator).

We discussed how and when we should use TreeMap in real time applications. We compared the performance of TreeMap with HashMap to bettter understand when to use which version of Map.

Drop me your questions related to working with TreeMap in Java in comments section.

Класс TreeMap, его устройство и способ применения.

Введение

В интернете можно часто встретить вопросы про то, что такое TreeMap, как он устроен, и как им пользоваться. В данной статье я постараюсь кратко ответить на эти вопросы.

Класс TreeMap расширяет класс AbstractMap и реализует интерфейс NavigatebleMap. Он создает коллекцию, которая для хранения элементов применяет дерево. Объекты сохраняются в отсортированном порядке по возрастанию. Время доступа и извлечения элементов достаточно мало, что делает класс TreeMap блестящим выбором для хранения больших объемов отсортированной информации, которая должна быть быстро найдена.

На рисунке 1 показана иерархия предков TreeMap.

Рисунок 1

TreeMap основан на Красно-Черном дереве, вследствие чего TreeMap сортирует элементы по ключу в естественном порядке или на основе заданного вами компаратора.TreeMap гарантирует скорость доступа log(n) для операций containsKey, get, put и remove.

Пример

Давайте рассмотрим простой пример использования TreeMap

Map treeMap = new TreeMap<>();

treeMap.put( «Bruce» , «Willis» );

treeMap.put( «Arnold» , «Schwarzenegger» );

treeMap.put( «Jackie» , «Chan» );

treeMap.put( «Sylvester» , «Stallone» );

treeMap.put( «Chuck» , «Norris» );

for (Map.Entry e : treeMap.entrySet())<

Вывод на консоль:

Arnold Schwarzenegger
Bruce Willis
Chuck Norris
Jackie Chan
Sylvester Stallone

Как видим, элементы отсортированы по ключу (Chuck Norris не первый :О).

Чтобы получить ключи и значения нужно использовать методы keySet() и values().

При попытке добавить null-элемент в TreeMap происходит исключение NullPointerException.

Конструкторы

В классе TreeMap присутствуют следующие конструкторы:

2. TreeMap(Comparator comp)

4. TreeMap(SortedMap sm)

Первый конструктор создает коллекцию, в которой все элементы отсортированы в натуральном порядке их ключей.

Второй конструктор создаст пустую коллекцию, элементы в которой будут отсортированы по закону, который определен в передаваемом компараторе.

Третий конструктор создаст TreeMap на основе уже имеющегося Map.

Четвертый конструктор создаст TreeMap на основе уже имеющегося SortedMap , элементы в которой будут отсортированы по закону передаваемой SortedMap .

Обратите внимание на то, что для сортировки используются ключи, а не значения.

Синхронизация

TreeMap не синхронизирован. По этому, если имеется множество потоков, работающих с данной коллекцией и хотя бы один поток может её изменять , то коллекцию нужно синхронизировать внешне.

Можно воспользоваться стандартным механизмом синхронизации, при котором в качестве монитора передаться ссылка объекта, инкапсулирующий данную коллекцию. Если такого объекта нет, можно воспользоваться методом synchronizedSortedMap .
Например:

SortedMap m = Collections.synchronizedSortedMap(new TreeMap(. ));

Создание собственного порядка сортировки

Для определения собственного порядка следования элементов в коллекции, нужно реализовать интерфейс Comparator и передать объект своего компаратора в качестве конструктора TreeMap

public interface Comparator <

public int compare (Object object1, Object object2);

public boolean equals (Object object);

Или реализовать интерфейс Comparable у класса, который будет использоваться в качестве ключа.

public interface Comparable <

public int compareTo (Object objectToCompare);

Классы Integer, String, Double и т.п. реализуют интерфейс Comparable. Если вы создали собственный класс для ключей и не реализовали интерфейс Comparable (и не используете Comparator), то при попытке добавления объекта в коллекцию будет брошено исключение java.lang.ClassCastException!

public class MyCustomKey implements Comparable<

private int value;

public MyCustomKey( int value)<

this .value = value;

public int compareTo (MyCustomKey key)<

int comparison = 0 ;

// Return -1 if this.value key.value

return (comparison);

public int hashCode()<

return ( this .value * 199 );

Частая ошибка при использовании TreeMap, в том, что для класса ключа не определяется метод hashcode(). Если в данном случае использовать метод map.get(new MyCustomKey( )), то результат может быть непредсказуем. Поэтому всегда рекомендуется реализовать метод hashCode() для класса ключей.

Структура данных

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

Двоичным деревом поиска (ДДП) называют дерево, все вершины которого упорядочены, каждая вершина имеет не более двух потомков (назовём их левым и правым), и все вершины, кроме корня, имеют родителя. Вершины, не имеющие потомков, называются листами. Подразумевается, что каждой вершине соответствует элемент или несколько элементов, имеющие некие ключевые значения, в дальнейшем именуемые просто ключами.

ДДП позволяет выполнять следующие основные операции:

· Поиск вершины по ключу.

· Определение вершин с минимальным и максимальным значением ключа.

· Переход к предыдущей или последующей вершине, в порядке, определяемом ключами.

У читателя, возможно, возникает вопрос, зачем нужны такие сложности, если можно просто хранить список пар [ключ, значение]. Ответ прост — операции с деревом работают быстрее. При реализации списком все функции требуют O(n) действий, где n — размер структуры. Операции с деревом же работают за O(h), где h — максимальная глубина дерева (глубина — расстояние от корня до вершины). В оптимальном случае, когда глубина всех листьев одинакова, в дереве будет n=2^h вершин. Значит, сложность операций в деревьях, близких к оптимуму будет O(log(n)).


Рисунок 2

В худшем случае дерево может принять вид, изображённый на рисунке 1. Сложность операций в таком случае будет как у списка.

Красно-черные деревья

Для того, чтобы ситуации как на рисунке 2 не было, применяют специальные сбалансированные деревья.

1. B-дерево
2. АВЛ-дерево
3. Красно-чёрное дерево
….

Красно-чёрное дерево — двоичное дерево поиска, в котором каждый узел имеет атрибут цвет, принимающий значения красный или черный. В дополнение к обычным требованиям, налагаемым на двоичные деревья поиска, к красно-чёрным деревьям применяются следующие требования:

Читать еще:  Java пространство имен

1. Узел либо красный, либо чёрный.
2. Корень — чёрный. (В других определениях это правило иногда опускается. Это правило слабо влияет на анализ, так как корень всегда может быть изменен с красного на чёрный, но не обязательно наоборот).
3. Все листья(NIL) — черные.
4. Оба потомка каждого красного узла — черные.
5. Всякий простой путь от данного узла до любого листового узла, являющегося его потомком, содержит одинаковое число черных узлов.

Некоторые считают, что красно-черные деревья это всего лишь проекция 2-3-4 деревьев в чисто бинарные, где «настоящие узлы» 2-3-4 деревьев — это черные, а подузлы с 3-мя или 4-мя потомками это красные. Если смотреть правила балансировки 2-3-4 деревьев, то они очень простые, а если смотреть правила балансировки красно-черных деревьев, то они выглядят как мантры и заклинания, где ничего непонятно. 🙂


Рисунок 3

Количество черных узлов на ветви от корня до листа называется черной высотой дерева. Перечисленные свойства гарантируют, что самая длинная ветвь от корня к листу не более чем вдвое длиннее любой другой ветви от корня к листу. Чтобы понять, почему это так, рассмотрим дерево с черной высотой 2. Кратчайшее возможное расстояние от корня до листа равно двум – когда оба узла черные. Длиннейшее расстояние от корня до листа равно четырем – узлы при этом покрашены (от корня к листу) так: красный–>черный–>красный–>черный. Сюда нельзя добавить черные узлы, поскольку при этом нарушится свойство 4, из которого вытекает корректность понятия черной высоты.

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

Если Вы с первого раза не поняли, как работает красно-черное дерево (как и я), то воспользуйтесь визуализатором по ссылке красно-черные деревья . Там пошагово рассказывают и показывают операции поиска и вставки элементов.

Если Вам понравилась статья, проголосуйте за нее

Голосов: 37 Голосовать

Найти позицию элемента в Java TreeMap

Я работаю с TreeMap строк TreeMap , и используя его для реализации набора слов.

затем у меня есть коллекция файлов, и я хотел бы создать представление каждого файла в векторном пространстве (пространстве слов), определенном словарем.

каждый файл должен иметь вектор, представляющий его следующие свойства:

  • вектор должен иметь тот же размер, что и словарь
  • для каждого слова содержится в файле вектор должен иметь 1 в позиции, соответствующей позиции слова в словарь
  • за каждое слово не содержится в файле вектор должен иметь -1 в позиции, соответствующей позиции слова в словарь

Итак, моя идея-использовать Vector для реализации этих векторов. (Этот способ представления документов в коллекции называется логическое Модель -http://www.site.uottawa.ca /

проблема, с которой я сталкиваюсь в процедуре создания этого вектора, заключается в том, что мне нужен способ найти положение слова в словаре, что-то вроде этого:

1) Есть ли такой метод, который я могу использовать на TreeMap?Если нет, вы можете предоставить какой-то код, чтобы помочь мне реализовать его самостоятельно?

2) есть ли итератор на TreeMap (он в алфавитном порядке на клавишах), из которых я можете получить позицию?

3)в конечном итоге я должен использовать другой класс для реализации словаря?(Если вы думаете, что с TreeMaps я не могу делать то, что мне нужно) если да, то что?

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

любые другие идеи на мои вопросы?

8 ответов

после того, как вы построили карту дерева, скопируйте ее отсортированные ключи в массив и используйте Arrays.binarySearch для поиска индекса в O(logN) времени. Если вам нужно значение, выполните поиск на исходной карте тоже.

Edit: вот как вы копируете ключи в массив

в самом JDK такой реализации нет. Хотя TreeMap итерации в естественном порядке ключей, его внутренние структуры данных основаны на деревьях, а не массивах (помните, что Maps Не заказывайте ключи по определению, несмотря на то, что это очень распространенный вариант использования).

тем не менее, вы должны сделать выбор, поскольку невозможно иметь время вычисления O(1) для ваших критериев сравнения как для вставки в Map и indexOf(key) расчет. Это связано с тот факт, что лексикографический порядок нестабилен в изменяемой структуре данных (в отличие от порядка вставки, например). Пример: как только вы вставляете первую пару ключ-значение (запись) в карту, ее позиция всегда будет одной. Однако в зависимости от второго вставленного ключа эта позиция может измениться, поскольку новый ключ может быть «больше» или «ниже», чем в Map . Вы можете реализовать это, поддерживая и обновляя индексированный список ключей во время операции вставки, но тогда у вас будет O(N log(n)) для ваших операций вставки (так как вам нужно будет переупорядочить массив). Это может быть желательно или нет, в зависимости от ваших шаблонов доступа к данным.

ListOrderedMap и LinkedMap в Apache Commons оба приближаются к тому, что вам нужно, но полагаются на порядок вставки. Вы можете проверить их реализацию и разработать свое собственное решение проблемы с небольшими и умеренными усилиями, я считаю (это должно быть просто вопросом замены ListOrderedMap s внутренний массив поддержки с сортированный список — TreeList в Apache Commons, например).

вы также можете вычислить индекс самостоятельно, вычитая количество элементов, которые ниже, чем заданный ключ (который должен быть быстрее, чем итерация по списку поиска вашего элемента, в наиболее частом случае — поскольку вы ничего не сравниваете).

альтернативным решением было бы использовать TreeMap ‘ s headMap метод. Если слово существует в TreeMap , потом size() его карта головы равна индексу слова в словаре. Это может быть немного расточительно по сравнению с моим другим ответом, через.

вот как вы кодируете его на Java:

вот результат, полученный программой:

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

я считаю, что лучшие ответы на мои отдельные вопросы:

2) на картах деревьев нет итератора, определенного как @Isoliveira sais:

и как я нашел в этом так ответа как перебрать TreeMap?, единственный способ итерации по элементам в Map использовать map.entrySet() и использовать итераторы, определенные на Set (или какой-то другой класс с итераторами).

3) можно использовать TreeMap реализовать словарь, но это гарантирует сложность O (logN) в поиске индекса содержащегося слова (стоимость поиска в структуре данных дерева).

С помощью HashMap С той же процедурой вместо этого будет иметь сложность O (1).

1) такого метода не существует. Единственное решение-реализовать его полностью.

как заявил @Paul

предположение решения заключается в том, что как только этот словарь будет создан, он не будет изменен впоследствии: таким образом, положение слова всегда будет одинаковым.

давая это предположение, я нашел решение, которое позволяет построить словарь со сложностью O (N) и после гарантии возможности получить индекс a слово, содержащееся с константой времени O (1) в поиске.

я определил словарь как HashMap такой:

  • ключ —> на String представляя слово, содержащееся в словаре
  • значение —> an Object созданного класса WordStruct
Читать еще:  Отсортировать arraylist java

здесь WordStruct класс определяется следующим образом:

и позволяет мне хранить память о любом атрибуте, который мне нравится соединять со словом Словарь.

теперь я заполняю словарь, повторяя все слова, содержащиеся во всех файлах моей коллекции:

после заполнения HashMap в любом порядке я использую процедуру, указанную @dasblinkenlight, чтобы заказать ее раз и навсегда со сложностью O(N)

и отныне, чтобы иметь позицию индекса в алфавитном порядке слова в словаре, нужно только получить переменную DictionaryPosition :

так как слово знает, что вы просто нужно получить к нему доступ, и это имеет постоянную стоимость в HashMap .

еще раз спасибо и желаю вам всем счастливого Рождества!!

у меня была та же проблема. Поэтому я взял исходный код java.утиль.TreeMap и написал IndexedTreeMap. Он реализует мой собственный IndexedNavigableMap:

реализация основана на обновлении Весов узлов в красно-черном дереве при его изменении. Вес-это количество дочерних узлов под данным узлом, плюс один-self. Например, когда дерево поворачивается влево:

updateWeight просто обновляет вес до корень:

и когда нам нужно найти элемент по индексу вот реализация, которая использует вес:

также очень удобно найти индекс ключа:

Я скоро реализую IndexedTreeSet, а пока вы можете использовать набор ключей из IndexedTreeMap.

обновление: теперь реализован IndexedTreeSet.

Я согласен с Isolvieira. Пожалуй, лучшим подходом было бы использовать другую структуру, чем дерева.

однако, если вы все еще хотите пойти с вычислением индекса ключей, решение будет посчитать, сколько ключей ниже, чем ключ, который вы ищете.

вот фрагмент кода:

вы думали, чтобы сделать значения в вашем TreeMap содержать позицию в словаре? Я использую BitSet здесь мои данные файла.

это работает не так хорошо, как моя другая идея ниже.

здесь построение деталей файла состоит из одного поиска в TreeMap для каждого слова в файле.

если вы планируете использовать value в словарь TreeMap для чего-то еще вы всегда может составить его с Integer .

добавил

думая об этом далее, если

Я бы предложил вам написать SkipList для хранения вашего словаря, так как это по-прежнему будет предлагать поиск, вставку и удаление O(log N), а также возможность предоставлять индекс (реализации дерева обычно не могут возвращать индекс, так как узлы его не знают, и будет стоить их обновления). К сожалению, реализация Java ConcurrentSkipListMap не предоставляет индекс, поэтому вам нужно будет реализовать свою собственную версию.

получаете индекс элемента будет O (log N), если вы хотите как индекс, так и значение, не делая 2 поиска, вам нужно будет вернуть объект-оболочку, содержащий оба.

Java Treemap – java.util.TreeMap Example

Posted by: Mary Zheng in TreeMap November 27th, 2014 0 Views

1. Introduction

In this example we will see how and when to use the Java Treemap class java.util.TreeMap. A TreeMap is a Red-Black tree based NavigableMap implementation which has log(n) time cost for the basic operations: add, remove, and contains.

A TreeMap guarantees that the elements inserted remains sorted on the order of keys. The elements are ordered using the natural ordering of the keys, or by a Comparator typically provided at the sorted map creation time. A TreeMap is typically used when, in a map, we want to keep the elements sorted all times by the keys. The keys could also be custom objects defined with comparable / comparator to decide the attribute responsible for sorting.

As the diagram showing, TreeMap implements Map, MavigableMap, and SortedMap interfaces. I will demonstrate commonly used TreeMap constructors and methods.

2. Technologies Used

The example code in this article was built and run using:

  • Java 11
  • Maven 3.3.9
  • Eclipse Oxygen
  • Junit 4.12

3. Maven Project

In this step, I will create a Maven project.

3.1 Dependencies

Add Junit library to the pom.xml .

3.2 User

In this step, I will create a User class which implements Comparable . It has firstName , lastName , and salary data members. The compareTo method is based on the firstName and lastName .

3.3 UserSalaryComparator

In this step, I will create a UserSalaryComparator which implements the Comparator interface. The compare method is based on the user’s salary.

3.4 PrintService

TreeMap has the several methods to retrieve the elements:

  • Set > entrySet() – returns a Set view of the mappings contained in this map.
  • default void forEach ​(BiConsumer action) – performs the given action for each entry in this map until all entries have been processed or the action throws an exception.
  • Set keySet() – returns a Set view of the keys contained in this map.
  • Collection values() – returns a Collection view of the values contained in this map.

In this step, I will create a PrintService which prints out the TreeMap’s elements via entrySet , forEach , keySet , and values methods.

4. Junit Test Classes

4.1 MapTestUtil

TreeMap extends from the AbstractMap class. I will demonstrate the common used methods from Map in a Junit test class.

In this step, I will create a MapTestUtil which has three methods:

  • add4Elements(Map) – It adds 4 elements to map with the put method, checks the map’s size with the size method, retrieves the value based on the key with the get method, and check the key with the containsKey method.
  • removeElements – it removes and replaces an element.
  • add4Users(Map) – it demonstrates the put method for a new element, get method to return an element, containsKey to check if the map has the given key or not.

4.2 TreeMapTest

TreeMap implements the NavigableMap interface. In this step, I will create a TreeMapTest to demonstrate the commonly used constructors and methods.

  • setup – It creates four TreeMap instances. Some created with the default constructor, others created with a special Comparator .
  • test_integer_key – it adds elements, find the first entry, last entry, returns a portion of map, etc.
  • test_integer_key_reversOrder – it creates a TreeMap from a sorted map.
  • test_KeyIsComparabale – it creates a TreeMap with the User class. The User class implements Comparable and is sorted on the basis of firstName and lastName .
  • test_KeyIsComparator – It creates a TreeMap from a sorted map and maintains the same order – based on the user’s salary. .
  • will_throw_NullPointerException – it demonstrates the put method will throw a NullPointerException if the key is null .

Execute mvn test -Dtest=TreeMapTest and capture output.

4.3 Thread-Safe TreeMap

TreeMap is not thread-safe. Java Collection framework provides the Collections.synchronizedSortedMap method to ensure thread-safe.

In this step, I will create a ThreadSafe_TreeMapTest which runs 1000 threads to put the element into a TreeMap object. We will get 1000 elements into the synchronized map for sure. However, it may or may not get 1000 elements into a normal TreeMap .

Now, execute the Junit test and capture the output here.

5. Summary

In this example, I demonstrated how to create a TreeMap and how to sort its elements. I also demonstrated how to find, add, retrieve, and iterate the map elements.

Important thing to note is that the ordering maintained by a treeMap must be consistent with equals if this sorted map is to correctly implement the Map interface.

6. Download the Source Code

In this example we saw various ways of using a TreeMap .

Last updated on Aug 23, 2019

Ссылка на основную публикацию
Adblock
detector