Na implementáciu sa používa stromová mapa v jazyku Java Mapové rozhranie a NavigableMap spolu s triedou AbstractMap. Mapa je zoradená podľa prirodzeného poradia jej kľúčov alebo podľa a Porovnávač poskytované v čase vytvorenia mapy v závislosti od použitého konštruktora. Toto sa ukazuje ako efektívny spôsob triedenia a ukladania párov kľúč – hodnota. Poradie ukladania udržiavané stromovou mapou musí byť konzistentné s rovnakým ako každá iná triedená mapa, bez ohľadu na explicitné porovnávače. Implementácia stromovej mapy nie je synchronizovaná v tom zmysle, že ak k mape pristupuje viacero vlákien súčasne a aspoň jedno z vlákien štrukturálne modifikuje mapu, musí byť synchronizovaná externe.
TreeMap v Jave je konkrétna implementácia rozhrania java.util.SortedMap. Poskytuje usporiadanú kolekciu párov kľúč-hodnota, kde sú kľúče usporiadané na základe ich prirodzeného poradia alebo vlastného komparátora odovzdaného konštruktorovi.
TreeMap je implementovaný pomocou červeno-čierneho stromu, čo je typ samovyvažujúceho binárneho vyhľadávacieho stromu. To poskytuje efektívny výkon pre bežné operácie, ako je pridávanie, odstraňovanie a získavanie prvkov, s priemernou časovou zložitosťou O (log n).
Tu je príklad, ako používať triedu TreeMap:
Java
import> java.util.Map;> import> java.util.TreeMap;> public> class> Main {> >public> static> void> main(String[] args) {> >Map treeMap =>new> TreeMap();> >// Adding elements to the tree map> >treeMap.put(>'A'>,>1>);> >treeMap.put(>'C'>,>3>);> >treeMap.put(>'B'>,>2>);> >// Getting values from the tree map> >int> valueA = treeMap.get(>'A'>);> >System.out.println(>'Value of A: '> + valueA);> >// Removing elements from the tree map> >treeMap.remove(>'B'>);> >// Iterating over the elements of the tree map> >for> (String key : treeMap.keySet()) {> >System.out.println(>'Key: '> + key +>', Value: '> + treeMap.get(key));> >}> >}> }> |
>
>Výkon
Value of A: 1 Key: A, Value: 1 Key: C, Value: 3>

Vlastnosti stromovej mapy
Niektoré dôležité vlastnosti stromovej mapy sú nasledovné:
- Táto trieda je členom Kolekcie Java Rámec.
- Trieda implementuje Mapové rozhrania vrátane NavigableMap , SortedMap a rozširuje triedu AbstractMap.
- TreeMap v jazyku Java nepovoľuje nulové kľúče (ako Map), a preto je vyvolaná výnimka NullPointerException. K rôznym kľúčom však možno priradiť viacero hodnôt null.
- Vstupné páry vrátené metódami v tejto triede a jej zobrazenia predstavujú snímky mapovaní v čase, keď boli vytvorené. Nepodporujú metódu Entry.setValue.
Teraz poďme vpred a diskutujme o synchronizovanej stromovej mape. Implementácia stromovej mapy nie je synchronizovaná. To znamená, že ak viaceré vlákna pristupujú k množine stromov súčasne a aspoň jedno z vlákien množinu upravuje, musí byť synchronizovaná externe. To sa zvyčajne dosiahne pomocou metódy Collections.synchronizedSortedMap. Najlepšie je to urobiť v čase vytvorenia, aby ste predišli náhodnému nesynchronizovanému prístupu k súprave. Dá sa to urobiť takto:
SortedMap m = Collections.synchronizedSortedMap(new TreeMap(...));>
Geeks, teraz sa musíte pýtať, ako funguje TreeMap interne?
Metódy v stromovej mape pri získavaní sady kľúčov a hodnôt vracajú Iterátor, ktorý je svojou povahou rýchly. Každá súbežná úprava teda vyvolá výnimku ConcurrentModificationException . Stromová mapa je založená na červeno-čiernej stromovej dátovej štruktúre.
Každý uzol v strome má:
- 3 premenné ( K kľúč = kľúč, hodnota V = hodnota, booleovská farba = farba )
- 3 referencie ( Vstup vľavo = ľavý, vstup vpravo = vpravo, vstup rodič = rodič )
Konštruktéri v TreeMap
Aby sme vytvorili TreeMap, musíme vytvoriť objekt triedy TreeMap. Trieda TreeMap pozostáva z rôznych konštruktorov, ktoré umožňujú možné vytvorenie TreeMap. V tejto triede sú dostupné nasledujúce konštruktory:
- TreeMap()
- TreeMap (Comparator comp)
- Stromová mapa (Mapa M)
- Stromová mapa (SortedMap sm)
Poďme o nich diskutovať jednotlivo spolu s implementáciou každého konštruktora takto:
Konštruktor 1: TreeMap()
Tento konštruktor sa používa na vytvorenie prázdnej stromovej mapy, ktorá bude zoradená podľa prirodzeného poradia jej kľúčov.
Príklad
Java
// Java Program to Demonstrate TreeMap> // using the Default Constructor> // Importing required classes> import> java.util.*;> import> java.util.concurrent.*;> // Main class> // TreeMapImplementation> public> class> GFG {> >// Method 1> >// To show TreeMap constructor> >static> void> Example1stConstructor()> >{> >// Creating an empty TreeMap> >TreeMap tree_map> >=>new> TreeMap();> >// Mapping string values to int keys> >// using put() method> >tree_map.put(>10>,>'Geeks'>);> >tree_map.put(>15>,>'4'>);> >tree_map.put(>20>,>'Geeks'>);> >tree_map.put(>25>,>'Welcomes'>);> >tree_map.put(>30>,>'You'>);> >// Printing the elements of TreeMap> >System.out.println(>'TreeMap: '> + tree_map);> >}> >// Method 2> >// Main driver method> >public> static> void> main(String[] args)> >{> >System.out.println(>'TreeMap using '> >+>'TreeMap() constructor:
'>);> >// Calling constructor> >Example1stConstructor();> >}> }> |
>
>Výkon
TreeMap using TreeMap() constructor: TreeMap: {10=Geeks, 15=4, 20=Geeks, 25=Welcomes, 30=You}> Konštruktor 2: TreeMap (Comparator comp)
Tento konštruktor sa používa na vytvorenie prázdneho objektu TreeMap, v ktorom budú prvky potrebovať externú špecifikáciu poradia triedenia.
Príklad
Java
// Java Program to Demonstrate TreeMap> // using Comparator Constructor> // Importing required classes> import> java.util.*;> import> java.util.concurrent.*;> // Class 1> // Helper class representing Student> class> Student {> >// Attributes of a student> >int> rollno;> >String name, address;> >// Constructor> >public> Student(>int> rollno, String name, String address)> >{> >// This keyword refers to current object itself> >this>.rollno = rollno;> >this>.name = name;> >this>.address = address;> >}> >// Method of this class> >// To print student details> >public> String toString()> >{> >return> this>.rollno +>' '> +>this>.name +>' '> >+>this>.address;> >}> }> // Class 2> // Helper class - Comparator implementation> class> Sortbyroll>implements> Comparator {> >// Used for sorting in ascending order of> >// roll number> >public> int> compare(Student a, Student b)> >{> >return> a.rollno - b.rollno;> >}> }> // Class 3> // Main class> public> class> GFG {> >// Calling constructor inside main()> >static> void> Example2ndConstructor()> >{> >// Creating an empty TreeMap> >TreeMap tree_map> >=>new> TreeMap(> >new> Sortbyroll());> >// Mapping string values to int keys> >tree_map.put(>new> Student(>111>,>'bbbb'>,>'london'>),>2>);> >tree_map.put(>new> Student(>131>,>'aaaa'>,>'nyc'>),>3>);> >tree_map.put(>new> Student(>121>,>'cccc'>,>'jaipur'>),>1>);> >// Printing the elements of TreeMap> >System.out.println(>'TreeMap: '> + tree_map);> >}> >// Main driver method> >public> static> void> main(String[] args)> >{> >System.out.println(>'TreeMap using '> >+>'TreeMap(Comparator)'> >+>' constructor:
'>);> >Example2ndConstructor();> >}> }> |
>
>Výkon
TreeMap using TreeMap(Comparator) constructor: TreeMap: {111 bbbb london=2, 121 cccc jaipur=1, 131 aaaa nyc=3}> Konštruktor 3: Stromová mapa (Mapa M)
Tento konštruktor sa používa na inicializáciu TreeMap s položkami z danej mapy M, ktoré budú zoradené podľa prirodzeného poradia klávesov.
Príklad
Java
// Java Program to Demonstrate TreeMap> // using the Default Constructor> // Importing required classes> import> java.util.*;> import> java.util.concurrent.*;> // Main class> public> class> TreeMapImplementation {> >// Method 1> >// To illustrate constructor> >static> void> Example3rdConstructor()> >{> >// Creating an empty HashMap> >Map hash_map> >=>new> HashMap();> >// Mapping string values to int keys> >// using put() method> >hash_map.put(>10>,>'Geeks'>);> >hash_map.put(>15>,>'4'>);> >hash_map.put(>20>,>'Geeks'>);> >hash_map.put(>25>,>'Welcomes'>);> >hash_map.put(>30>,>'You'>);> >// Creating the TreeMap using the Map> >TreeMap tree_map> >=>new> TreeMap(hash_map);> >// Printing the elements of TreeMap> >System.out.println(>'TreeMap: '> + tree_map);> >}> >// Method 2> >// Main driver method> >public> static> void> main(String[] args)> >{> >System.out.println(>'TreeMap using '> >+>'TreeMap(Map)'> >+>' constructor:
'>);> >Example3rdConstructor();> >}> }> |
>
>Výkon
TreeMap using TreeMap(Map) constructor: TreeMap: {10=Geeks, 15=4, 20=Geeks, 25=Welcomes, 30=You}> Konštruktor 4: Stromová mapa (SortedMap sm)
Tento konštruktor sa používa na inicializáciu TreeMap so záznamami z danej zoradenej mapy, ktoré budú uložené v rovnakom poradí ako daná zoradená mapa.
Príklad
Java
// Java Program to Demonstrate TreeMap> // using the SortedMap Constructor> // Importing required classes> import> java.util.*;> import> java.util.concurrent.*;> // Main class> // TreeMapImplementation> public> class> GFG {> >// Method> >// To show TreeMap(SortedMap) constructor> >static> void> Example4thConstructor()> >{> >// Creating a SortedMap> >SortedMap sorted_map> >=>new> ConcurrentSkipListMap();> >// Mapping string values to int keys> >// using put() method> >sorted_map.put(>10>,>'Geeks'>);> >sorted_map.put(>15>,>'4'>);> >sorted_map.put(>20>,>'Geeks'>);> >sorted_map.put(>25>,>'Welcomes'>);> >sorted_map.put(>30>,>'You'>);> >// Creating the TreeMap using the SortedMap> >TreeMap tree_map> >=>new> TreeMap(sorted_map);> >// Printing the elements of TreeMap> >System.out.println(>'TreeMap: '> + tree_map);> >}> >// Method 2> >// Main driver method> >public> static> void> main(String[] args)> >{> >System.out.println(>'TreeMap using '> >+>'TreeMap(SortedMap)'> >+>' constructor:
'>);> >Example4thConstructor();> >}> }> |
>
>Výkon
TreeMap using TreeMap(SortedMap) constructor: TreeMap: {10=Geeks, 15=4, 20=Geeks, 25=Welcomes, 30=You}> Metódy v triede TreeMap
| Metóda | Akcia vykonaná |
|---|---|
| jasný() | Metóda odstráni všetky mapovania z tejto stromovej mapy a vymaže mapu. |
| klon() | Metóda vráti plytkú kópiu tejto stromovej mapy. |
| obsahuje kľúč (kľúč objektu) | Vráti hodnotu true, ak táto mapa obsahuje mapovanie pre zadaný kľúč. |
| obsahujeValue(hodnota objektu) | Vráti hodnotu true, ak táto mapa mapuje jeden alebo viac kľúčov na zadanú hodnotu. |
| entrySet() | Vráti nastavený pohľad na mapovania obsiahnuté v tejto mape. |
| firstKey() | Vráti prvý (najnižší) kľúč aktuálne v tejto zoradenej mape. |
| get (kľúč objektu) | Vráti hodnotu, na ktorú táto mapa mapuje zadaný kľúč. |
| headMap(hodnota kľúča objektu) | Metóda vráti pohľad na časť mapy striktne menšiu ako parameter key_value. |
| keySet() | Metóda vráti pohľad Set kľúčov obsiahnutých v stromovej mape. |
| lastKey() | Vráti posledný (najvyšší) kľúč aktuálne v tejto zoradenej mape. |
| put (kľúč objektu, hodnota objektu) | Metóda sa používa na vloženie mapovania do mapy. |
| putAll (mapa mapy) | Skopíruje všetky mapovania zo zadanej mapy do tejto mapy. |
| odstrániť (kľúč objektu) | Odstráni mapovanie pre tento kľúč z tejto stromovej mapy, ak existuje. |
| veľkosť () | Vráti počet mapovaní kľúč – hodnota v tejto mape. |
| subMap((K startKey, K endKey) | Metóda vráti časť tejto mapy, ktorej kľúče sú v rozsahu od startKey, vrátane, po endKey, exkluzívne. |
| hodnoty() | Vráti zobrazenie kolekcie hodnôt obsiahnutých v tejto mape. |
Implementácia: Nasledujúce programy vám lepšie ukážu, ako vytvoriť, vložiť a prechádzať cez stromovú mapu.
Ilustrácia:
Java
// Java Program to Illustrate Operations in TreeMap> // Such as Creation, insertion> // searching, and traversal> // Importing required classes> import> java.util.*;> import> java.util.concurrent.*;> // Main class> // Implementation of TreeMap> public> class> GFG {> >// Declaring a TreeMap> >static> TreeMap tree_map;> >// Method 1> >// To create TreeMap> >static> void> create()> >{> >// Creating an empty TreeMap> >tree_map =>new> TreeMap();> >// Display message only> >System.out.println(>'TreeMap successfully'> >+>' created'>);> >}> >// Method 2> >// To Insert values in the TreeMap> >static> void> insert()> >{> >// Mapping string values to int keys> >// using put() method> >tree_map.put(>10>,>'Geeks'>);> >tree_map.put(>15>,>'4'>);> >tree_map.put(>20>,>'Geeks'>);> >tree_map.put(>25>,>'Welcomes'>);> >tree_map.put(>30>,>'You'>);> >// Display message only> >System.out.println(>'
Elements successfully'> >+>' inserted in the TreeMap'>);> >}> >// Method 3> >// To search a key in TreeMap> >static> void> search(>int> key)> >{> >// Checking for the key> >System.out.println(>'
Is key ''> + key> >+>'' present? '> >+ tree_map.containsKey(key));> >}> >// Method 4> >// To search a value in TreeMap> >static> void> search(String value)> >{> >// Checking for the value> >System.out.println(>'
Is value ''> + value> >+>'' present? '> >+ tree_map.containsValue(value));> >}> >// Method 5> >// To display the elements in TreeMap> >static> void> display()> >{> >// Displaying the TreeMap> >System.out.println(>'
Displaying the TreeMap:'>);> >System.out.println(>'TreeMap: '> + tree_map);> >}> >// Method 6> >// To traverse TreeMap> >static> void> traverse()> >{> >// Display message only> >System.out.println(>'
Traversing the TreeMap:'>);> >for> (Map.Entry e :> >tree_map.entrySet())> >System.out.println(e.getKey() +>' '> >+ e.getValue());> >}> >// Method 6> >// Main driver method> >public> static> void> main(String[] args)> >{> >// Calling above defined methods inside main()> >// Creating a TreeMap> >create();> >// Inserting the values in the TreeMap> >insert();> >// Search key '50' in the TreeMap> >search(>50>);> >// Search value 'Geeks' in the TreeMap> >search(>'Geeks'>);> >// Display the elements in TreeMap> >display();> >// Traversing the TreeMap> >traverse();> >}> }> |
>
>Výkon
TreeMap successfully created Elements successfully inserted in the TreeMap Is key '50' present? false Is value 'Geeks' present? true Displaying the TreeMap: TreeMap: {10=Geeks, 15=4, 20=Geeks, 25=Welcomes, 30=You} Traversing the TreeMap: 10 Geeks 15 4 20 Geeks 25 Welcomes 30 You> Vykonávanie rôznych operácií na TreeMap
Po zavedení Generics v Jave 1.5 je možné obmedziť typ objektu, ktorý je možné uložiť do TreeMap. Teraz sa pozrime, ako vykonať niekoľko často používaných operácií na stromovej mape.
Operácia 1: Pridávanie prvkov
Na pridanie prvku do stromovej mapy môžeme použiť metódu put() . Poradie vloženia sa však v stromovej mape nezachová. Interne sa kľúče pre každý prvok porovnávajú a triedia vo vzostupnom poradí.
Príklad
Java
// Java Program to Illustrate Addition of Elements> // in TreeMap using put() Method> // Importing required classes> import> java.util.*;> // Main class> class> GFG {> >// Main driver method> >public> static> void> main(String args[])> >{> >// Default Initialization of a TreeMap> >TreeMap tm1 =>new> TreeMap();> >// Inserting the elements in TreeMap> >// using put() method> >tm1.put(>3>,>'Geeks'>);> >tm1.put(>2>,>'For'>);> >tm1.put(>1>,>'Geeks'>);> >// Initialization of a TreeMap using Generics> >TreeMap tm2> >=>new> TreeMap();> >// Inserting the elements in TreeMap> >// again using put() method> >tm2.put(>new> Integer(>3>),>'Geeks'>);> >tm2.put(>new> Integer(>2>),>'For'>);> >tm2.put(>new> Integer(>1>),>'Geeks'>);> >// Printing the elements of both TreeMaps> >// Map 1> >System.out.println(tm1);> >// Map 2> >System.out.println(tm2);> >}> }> |
>
>Výkon
{1=Geeks, 2=For, 3=Geeks} {1=Geeks, 2=For, 3=Geeks}> Operácia 2: Zmena prvkov
Po pridaní prvkov, ak chceme prvok zmeniť, môžeme to urobiť opätovným pridaním prvku pomocou metódy put() . Keďže prvky v stromovej mape sú indexované pomocou kľúčov, hodnotu kľúča je možné zmeniť jednoduchým vložením aktualizovanej hodnoty pre kľúč, ktorý chceme zmeniť.
Príklad
Java
// Java program to Illustrate Updation of Elements> // in TreeMap using put() Method> // Importing required classes> import> java.util.*;> // Main class> class> GFG {> >// Main driver method> >public> static> void> main(String args[])> >{> >// Initialization of a TreeMap> >// using Generics> >TreeMap tm> >=>new> TreeMap();> >// Inserting the elements in Map> >// using put() method> >tm.put(>3>,>'Geeks'>);> >tm.put(>2>,>'Geeks'>);> >tm.put(>1>,>'Geeks'>);> >// Print all current elements in map> >System.out.println(tm);> >// Inserting the element at specified> >// corresponding to specified key> >tm.put(>2>,>'For'>);> >// Printing the updated elements of Map> >System.out.println(tm);> >}> }> |
>
>Výkon
{1=Geeks, 2=Geeks, 3=Geeks} {1=Geeks, 2=For, 3=Geeks}> Operácia 3: Odstraňuje sa prvok
Na odstránenie prvku zo stromovej mapy môžeme použiť metódu remove() . Táto metóda prevezme hodnotu kľúča a odstráni mapovanie kľúča z tejto stromovej mapy, ak sa na mape nachádza.
Príklad
Java
python sort dictionary
// Java program to Illustrate Removal of Elements> // in TreeMap using remove() Method> // Importing required classes> import> java.util.*;> // Main class> class> GFG {> >// Main driver method> >public> static> void> main(String args[])> >{> >// Initialization of a TreeMap> >// using Generics> >TreeMap tm> >=>new> TreeMap();> >// Inserting the elements> >// using put() method> >tm.put(>3>,>'Geeks'>);> >tm.put(>2>,>'Geeks'>);> >tm.put(>1>,>'Geeks'>);> >tm.put(>4>,>'For'>);> >// Printing all elements of Map> >System.out.println(tm);> >// Removing the element corresponding to key> >tm.remove(>4>);> >// Printing updated TreeMap> >System.out.println(tm);> >}> }> |
>
>Výkon
{1=Geeks, 2=Geeks, 3=Geeks, 4=For} {1=Geeks, 2=Geeks, 3=Geeks}> Operácia 4: Iterácia cez TreeMap
Existuje niekoľko spôsobov, ako iterovať cez mapu. Najznámejším spôsobom je použitie a pre každú slučku a získajte kľúče. Hodnota kľúča sa zistí pomocou getValue() metóda .
Príklad
Java
// Java Program to Illustrate Iterating over TreeMap> // using> // Importing required classes> import> java.util.*;> // Main class> class> GFG {> >// Main driver method> >public> static> void> main(String args[])> >{> >// Initialization of a TreeMap> >// using Generics> >TreeMap tm> >=>new> TreeMap();> >// Inserting the elements> >// using put() method> >tm.put(>3>,>'Geeks'>);> >tm.put(>2>,>'For'>);> >tm.put(>1>,>'Geeks'>);> >// For-each loop for traversal over Map> >// via entrySet() Method> >for> (Map.Entry mapElement : tm.entrySet()) {> >int> key = (>int>)mapElement.getKey();> >// Finding the value> >String value = (String)mapElement.getValue();> >// Printing the key and value> >System.out.println(key +>' : '> + value);> >}> >}> }> |
>
>Výkon
1 : Geeks 2 : For 3 : Geeks>
Výhody TreeMap:
- Usporiadané poradie: Stromová mapa poskytuje zoradené poradie svojich prvkov na základe prirodzeného poradia svojich kľúčov alebo vlastného porovnávača odovzdaného konštruktorovi. To je užitočné v situáciách, keď potrebujete získať prvky v určitom poradí.
- Predvídateľné poradie iterácií: Pretože prvky v stromovej mape sú uložené v zoradenom poradí, môžete predpovedať poradie, v ktorom sa vrátia počas iterácie, čo uľahčuje písanie algoritmov, ktoré spracovávajú prvky v špecifickom poradí.
- Výkon vyhľadávania: TreeMap poskytuje efektívnu implementáciu rozhrania mapy, ktorá vám umožňuje získavať prvky v logaritmickom čase, vďaka čomu je užitočná pri vyhľadávacích algoritmoch, kde potrebujete prvky rýchlo získať.
- Samovyvažovanie: TreeMap sa implementuje pomocou červeno-čierneho stromu, čo je typ samovyvažujúceho binárneho vyhľadávacieho stromu. To poskytuje efektívny výkon pri pridávaní, odstraňovaní a získavaní prvkov, ako aj pri udržiavaní zoradeného poradia prvkov.
Nevýhody TreeMap:
- Pomalé vkladanie prvkov: Vkladanie prvkov do stromovej mapy môže byť pomalšie ako vkladanie prvkov do bežnej mapy, pretože stromová mapa musí zachovať zoradené poradie svojich prvkov.
- Obmedzenie kľúča: Kľúče v stromovej mape musia implementovať rozhranie java.lang.Comparable alebo musí byť poskytnutý vlastný komparátor. Toto môže byť obmedzenie, ak potrebujete použiť vlastné kľúče, ktoré neimplementujú toto rozhranie.
Referenčná literatúra:
Java Collections od Mauricea Naftalina a Philipa Wadlera. Táto kniha poskytuje komplexný prehľad o rámci Java Collections, vrátane stromovej mapy.
Java v kocke od Davida Flanagana. Táto kniha poskytuje rýchlu referenciu o základných funkciách Java, vrátane stromovej mapy.
Java Generics and Collections od Mauricea Naftalina a Philipa Wadlera. Táto kniha poskytuje komplexného sprievodcu generikami a zbierkami v jazyku Java, vrátane stromovej mapy.