logo

TreeMap v jazyku Java

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é:

  1. Táto trieda je členom Kolekcie Java Rámec.
  2. Trieda implementuje Mapové rozhrania vrátane NavigableMap , SortedMap a rozširuje triedu AbstractMap.
  3. 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.
  4. 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:

  1. TreeMap()
  2. TreeMap (Comparator comp)
  3. Stromová mapa (Mapa M)
  4. 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:

  1. 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í.
  2. 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í.
  3. 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ť.
  4. 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:

  1. 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.
  2. 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.