logo

TreeMap v Javě

K implementaci se používá TreeMap v Javě Mapové rozhraní a NavigableMap spolu s třídou AbstractMap. Mapa je řazena podle přirozeného řazení svých klíčů nebo podle a Komparátor poskytované v době vytváření mapy v závislosti na použitém konstruktoru. To se ukazuje jako efektivní způsob třídění a ukládání párů klíč-hodnota. Pořadí ukládání udržované stromovou mapou musí být konzistentní s rovností stejně jako jakákoli jiná seřazená mapa, bez ohledu na explicitní komparátory. Implementace stromové mapy není synchronizována v tom smyslu, že pokud k mapě přistupuje více vláken, současně a alespoň jedno z vláken strukturálně upravuje mapu, musí být synchronizována externě.

TreeMap v Javě je konkrétní implementace rozhraní java.util.SortedMap. Poskytuje uspořádanou kolekci párů klíč-hodnota, kde jsou klíče seřazeny na základě jejich přirozeného pořadí nebo vlastního komparátoru předaného konstruktoru.



TreeMap je implementována pomocí Red-Black stromu, což je typ samovyvažujícího binárního vyhledávacího stromu. To poskytuje efektivní výkon pro běžné operace, jako je přidávání, odebírání a načítání prvků, s průměrnou časovou složitostí O(log n).

Zde je příklad, jak používat třídu TreeMap:

Jáva








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ýstup

Value of A: 1 Key: A, Value: 1 Key: C, Value: 3>

Vlastnosti stromové mapy

Některé důležité vlastnosti stromové mapy jsou následující:

  1. Tato třída je členem Kolekce Java Rámec.
  2. Třída implementuje Mapová rozhraní včetně NavigableMap , SortedMap a rozšiřuje třídu AbstractMap.
  3. TreeMap v Javě neumožňuje nulové klíče (jako Map), a proto je vyvolána výjimka NullPointerException. K různým klíčům však může být přiřazeno více hodnot null.
  4. Vstupní páry vrácené metodami v této třídě a její pohledy představují snímky mapování v době, kdy byly vytvořeny. Nepodporují metodu Entry.setValue.

Nyní pojďme kupředu a pojďme diskutovat o synchronizované stromové mapě. Implementace stromové mapy není synchronizována. To znamená, že pokud k sadě stromu přistupuje více vláken současně a alespoň jedno z nich sadu upravuje, musí být synchronizována externě. Toho se obvykle dosáhne pomocí metody Collections.synchronizedSortedMap. To se nejlépe provádí v době vytvoření, aby se zabránilo náhodnému nesynchronizovanému přístupu k sadě. To lze provést takto:

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

Geekové, teď se musíte divit, jak funguje TreeMap interně?

Metody ve stromové mapě při získávání sady klíčů a hodnot vracejí Iterátor, který je svou povahou rychlý. Jakákoli souběžná úprava tedy vyvolá ConcurrentModificationException . Stromová mapa je založena na červeno-černé stromové struktuře dat.

Každý uzel ve stromu má:

  • 3 proměnné ( Klíč K = klíč, hodnota V = hodnota, logická barva = barva )
  • 3 reference ( Vstup vlevo = Levý, Vstup vpravo = Pravý, Vstup rodič = Rodič )

Konstruktoři v TreeMap

Abychom mohli vytvořit TreeMap, musíme vytvořit objekt třídy TreeMap. Třída TreeMap se skládá z různých konstruktorů, které umožňují možné vytvoření TreeMap. V této třídě jsou k dispozici následující konstruktory:

  1. TreeMap()
  2. TreeMap (Comparator comp)
  3. Stromová mapa (Mapa M)
  4. Stromová mapa (SortedMap sm)

Proberme je jednotlivě spolu s implementací každého konstruktoru takto:

Konstruktor 1: TreeMap()

Tento konstruktor se používá k vytvoření prázdné stromové mapy, která bude setříděna pomocí přirozeného pořadí svých klíčů.

Příklad

Jáva




// 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ýstup

TreeMap using TreeMap() constructor: TreeMap: {10=Geeks, 15=4, 20=Geeks, 25=Welcomes, 30=You}>

Konstruktor 2: TreeMap (Comparator comp)

Tento konstruktor se používá k vytvoření prázdného objektu TreeMap, ve kterém budou prvky potřebovat externí specifikaci pořadí řazení.

Příklad

Jáva




// 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ýstup

TreeMap using TreeMap(Comparator) constructor: TreeMap: {111 bbbb london=2, 121 cccc jaipur=1, 131 aaaa nyc=3}>

Konstruktor 3: Stromová mapa (Mapa M)

Tento konstruktor se používá k inicializaci TreeMap se záznamy z dané mapy M, které budou seřazeny podle přirozeného pořadí kláves.

Příklad

Jáva




// 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ýstup

TreeMap using TreeMap(Map) constructor: TreeMap: {10=Geeks, 15=4, 20=Geeks, 25=Welcomes, 30=You}>

Konstruktor 4: Stromová mapa (SortedMap sm)

Tento konstruktor se používá k inicializaci TreeMap se záznamy z dané seřazené mapy, které budou uloženy ve stejném pořadí jako daná seřazená mapa.

Příklad

Jáva




// 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ýstup

TreeMap using TreeMap(SortedMap) constructor: TreeMap: {10=Geeks, 15=4, 20=Geeks, 25=Welcomes, 30=You}>

Metody ve třídě TreeMap

Metoda Akce provedena
Průhledná() Metoda odstraní všechna mapování z této stromové mapy a vymaže mapu.
klon() Metoda vrací mělkou kopii této stromové mapy.
obsahuje klíč (objektový klíč) Vrátí hodnotu true, pokud tato mapa obsahuje mapování pro zadaný klíč.
obsahujeValue(hodnota objektu) Vrátí hodnotu true, pokud tato mapa mapuje jeden nebo více klíčů na zadanou hodnotu.
entrySet() Vrátí nastavený pohled na mapování obsažená v této mapě.
firstKey() Vrátí první (nejnižší) klíč aktuálně v této tříděné mapě.
get (klíč objektu) Vrátí hodnotu, na kterou tato mapa mapuje zadaný klíč.
headMap (hodnota klíče objektu) Metoda vrací pohled na část mapy striktně menší než parametr key_value.
keySet() Metoda vrací zobrazení Set klíčů obsažených ve stromové mapě.
lastKey() Vrátí poslední (nejvyšší) klíč aktuálně v této tříděné mapě.
put (klíč objektu, hodnota objektu) Metoda se používá k vložení mapování do mapy.
putAll (mapa mapy) Zkopíruje všechna mapování ze zadané mapy do této mapy.
odstranit (klíč objektu) Odstraní mapování tohoto klíče z této stromové mapy, pokud je přítomno.
velikost() Vrátí počet mapování párů klíč–hodnota v této mapě.
subMap((K startKey, K endKey) Metoda vrací část této mapy, jejíž klíče jsou v rozsahu od startKey včetně, do endKey, exkluzivní.
hodnoty() Vrátí zobrazení kolekce hodnot obsažených v této mapě.

Implementace: Následující programy níže lépe ukáží, jak vytvořit, vložit a procházet stromovou mapu.

Ilustrace:

Jáva




// 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ýstup

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>

Provádění různých operací na TreeMap

Po zavedení Generics v Javě 1.5 je možné omezit typ objektu, který lze uložit do TreeMap. Nyní se podívejme, jak provést několik často používaných operací na stromové mapě.

Operace 1: Přidávání prvků

Abychom přidali prvek do TreeMap, můžeme použít metodu put() . Pořadí vložení však není ve stromové mapě zachováno. Interně jsou klíče pro každý prvek porovnány a seřazeny ve vzestupném pořadí.

Příklad

Jáva




// 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ýstup

{1=Geeks, 2=For, 3=Geeks} {1=Geeks, 2=For, 3=Geeks}>

Operace 2: Výměna prvků

Po přidání prvků, pokud chceme prvek změnit, to lze provést opětovným přidáním prvku pomocí metody put() . Vzhledem k tomu, že prvky ve stromové mapě jsou indexovány pomocí klíčů, hodnotu klíče lze změnit jednoduchým vložením aktualizované hodnoty klíče, který chceme změnit.

Příklad

Jáva




// 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ýstup

{1=Geeks, 2=Geeks, 3=Geeks} {1=Geeks, 2=For, 3=Geeks}>

Operace 3: Odebírání prvku

Abychom odstranili prvek ze stromové mapy, můžeme použít metodu remove() . Tato metoda převezme hodnotu klíče a odstraní mapování pro klíč z této stromové mapy, pokud je v mapě přítomen.

Příklad

Jáva




css pozadí

// 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ýstup

{1=Geeks, 2=Geeks, 3=Geeks, 4=For} {1=Geeks, 2=Geeks, 3=Geeks}>

Operace 4: Iterace přes TreeMap

Mapu lze iterovat několika způsoby. Nejznámějším způsobem je použití a pro každou smyčku a získat klíče. Hodnota klíče se zjistí pomocí metoda getValue(). .

Příklad

Jáva




// 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ýstup

1 : Geeks 2 : For 3 : Geeks>

Výhody TreeMap:

  1. Seřazené pořadí: Stromová mapa poskytuje seřazené pořadí svých prvků na základě přirozeného pořadí svých klíčů nebo vlastního komparátoru předaného konstruktoru. To je užitečné v situacích, kdy potřebujete načíst prvky v určitém pořadí.
  2. Předvídatelné pořadí iterací: Protože jsou prvky ve stromové mapě uloženy v seřazeném pořadí, můžete předvídat pořadí, ve kterém budou vráceny během iterace, což usnadňuje psaní algoritmů, které zpracovávají prvky v určitém pořadí.
  3. Výkon vyhledávání: TreeMap poskytuje efektivní implementaci rozhraní mapy, která vám umožňuje získávat prvky v logaritmickém čase, což je užitečné ve vyhledávacích algoritmech, kde potřebujete prvky rychle načíst.
  4. Self-balancing: TreeMap je implementován pomocí Red-Black stromu, což je typ samovyvažujícího binárního vyhledávacího stromu. To poskytuje efektivní výkon pro přidávání, odebírání a načítání prvků a také udržování setříděného pořadí prvků.

Nevýhody TreeMap:

  1. Pomalé vkládání prvků: Vkládání prvků do stromové mapy může být pomalejší než vkládání prvků do běžné mapy, protože stromová mapa musí udržovat seřazené pořadí svých prvků.
  2. Omezení klíče: Klíče ve stromové mapě musí implementovat rozhraní java.lang.Comparable nebo musí být poskytnut vlastní komparátor. To může být omezení, pokud potřebujete použít vlastní klíče, které neimplementují toto rozhraní.

Referenční knihy:

Java Collections od Maurice Naftalina a Philipa Wadlera. Tato kniha poskytuje komplexní přehled o frameworku Java Collections, včetně TreeMap.

Java v kostce od Davida Flanagana. Tato kniha poskytuje rychlý odkaz na základní funkce Javy, včetně stromové mapy.

Java Generics and Collections od Maurice Naftalina a Philipa Wadlera. Tato kniha poskytuje komplexního průvodce generikami a kolekcemi v Javě, včetně stromové mapy.