Mapové rozhraní v Javě
V Javě je Map Interface přítomno v balíčku java.util představuje mapování mezi klíčem a hodnotou. Rozhraní Java Map není podtypem rozhraní Rozhraní sběru . Proto se chová trochu jinak než ostatní typy kolekcí. Mapa obsahuje jedinečné klíče.
Geekové, ten brainstorming měl být proč a kdy používat Mapy.
Mapy jsou ideální pro mapování asociací klíč–hodnota, jako jsou slovníky. Mapy se používají k vyhledávání podle klíčů nebo když někdo chce získat a aktualizovat prvky pomocí klíčů. Některé běžné scénáře jsou následující:
- Mapa chybových kódů a jejich popisů.
- Mapa PSČ a měst.
- Mapa manažerů a zaměstnanců. Každému manažerovi (klíči) je přiřazen seznam zaměstnanců (hodnota), které řídí.
- Mapa tříd a studentů. Každá třída (klíč) je spojena se seznamem studentů (hodnota).
Vytváření mapových objektů
Vzhledem k tomu, že mapa je rozhraní , nelze vytvořit objekty typu mapa. Abychom mohli vytvořit objekt, vždy potřebujeme třídu, která tuto mapu rozšiřuje. A také po zavedení Generika v Javě 1.5 je možné omezit typ objektu, který lze uložit do mapy.
Syntax: Definování typově bezpečné mapy
Map hm = new HashMap(); // Obj is the type of the object to be stored in Map
Charakteristika mapového rozhraní
- Mapa nemůže obsahovat duplicitní klíče a každý klíč může mapovat nejvýše jednu hodnotu. Některé implementace umožňují nulový klíč a hodnoty null, jako je HashMap a LinkedHashMap, ale některým se nelíbí Stromová mapa .
- Pořadí mapy závisí na konkrétních implementacích. Například, Stromová mapa a LinkedHashMap mají předvídatelné objednávky, zatímco HashMap ne.
- Pro implementaci Map v Javě existují dvě rozhraní. Jsou to Map a SortedMap a tři třídy: HashMap, TreeMap a LinkedHashMap.
Metody v Java Map Interface
| Metoda | Akce provedena |
|---|---|
| Průhledná() | Tato metoda se používá v rozhraní Java Map Interface k vymazání a odstranění všech prvků nebo mapování ze zadané kolekce map. |
| obsahujeKey(Objekt) | Tato metoda se používá v Map Interface v Javě ke kontrole, zda je určitý klíč mapován do mapy nebo ne. Vezme klíčový prvek jako parametr a vrátí True, pokud je tento prvek namapován v mapě. |
| obsahujeValue(Objekt) | Tato metoda se používá v Map Interface ke kontrole, zda je konkrétní hodnota mapována jedním nebo více než jedním klíčem v mapě. Vezme hodnotu jako parametr a vrátí hodnotu True, pokud je tato hodnota mapována některým z klíčů v mapě. |
| entrySet() | Tato metoda se používá v Map Interface v Javě k vytvoření sady ze stejných prvků obsažených v mapě. V podstatě vrací nastavený pohled na mapu nebo můžeme vytvořit novou sadu a do ní uložit prvky mapy. |
| rovná se (Objekt) | Tato metoda se používá v Java Map Interface ke kontrole rovnosti mezi dvěma mapami. Ověřuje, zda se prvky jedné mapy předané jako parametr rovnají prvkům této mapy či nikoli. |
| získat (objekt) | Tato metoda se používá k načtení nebo načtení hodnoty mapované konkrétním klíčem uvedeným v parametru. Vrátí NULL, když mapa žádné takové mapování pro klíč neobsahuje. |
| hashCode() | Tato metoda se používá v Map Interface ke generování hashCode pro danou mapu obsahující klíče a hodnoty. |
| je prázdný() | Tato metoda se používá ke kontrole, zda mapa obsahuje nějaké položky pro páry klíčů a hodnot. Pokud žádné mapování neexistuje, vrátí to hodnotu true. |
| keySet() | Tato metoda se používá v rozhraní mapy k vrácení zobrazení sady klíčů obsažených v této mapě. Sada je podložena mapou, takže změny na mapě se projeví v sadě a naopak. |
| dát (objekt, objekt) | Tato metoda se používá v Java Map Interface k přidružení zadané hodnoty k zadanému klíči v této mapě. |
| dát vše (mapa) | Tato metoda se používá v Map Interface v Javě ke zkopírování všech mapování ze zadané mapy do této mapy. |
| odstranit (objekt) | Tato metoda se používá v Map Interface k odstranění mapování klíče z této mapy, pokud je na mapě přítomen. |
| velikost() | Tato metoda se používá k vrácení počtu párů klíč/hodnota dostupných v mapě. |
| hodnoty() | Tato metoda se používá v rozhraní Java Map Interface k vytvoření kolekce z hodnot mapy. V podstatě vrací pohled kolekce hodnot v HashMap. |
| getOrDefault (klíč objektu, V defaultValue) | Vrátí hodnotu, na kterou je zadaný klíč mapován, nebo defaultValue, pokud tato mapa neobsahuje žádné mapování pro klíč. |
| sloučení (klíč K, hodnota V, přemapování funkce BiFunction) | Pokud zadaný klíč ještě není přidružen k hodnotě nebo je přidružen k hodnotě null, přiřaďte jej k dané jiné hodnotě. |
| putIfAbsent (klíč K, hodnota V) | Pokud zadaný klíč ještě není přidružen k hodnotě (nebo je namapován na hodnotu null), přidruží jej k dané hodnotě a vrátí hodnotu null, jinak vrátí aktuální přidruženou hodnotu. |
Příklad:
Jáva
// Java Program to Demonstrate> // Working of Map interface> > // Importing required classes> import> java.util.*;> > // Main class> class> GFG {> > > // Main driver method> > public> static> void> main(String args[])> > {> > // Creating an empty HashMap> > Map hm> > => new> HashMap();> > > // Inserting pairs in above Map> > // using put() method> > hm.put(> 'a'> ,> new> Integer(> 100> ));> > hm.put(> 'b'> ,> new> Integer(> 200> ));> > hm.put(> 'c'> ,> new> Integer(> 300> ));> > hm.put(> 'd'> ,> new> Integer(> 400> ));> > > // Traversing through Map using for-each loop> > for> (Map.Entry me :> > hm.entrySet()) {> > > // Printing keys> > System.out.print(me.getKey() +> ':'> );> > System.out.println(me.getValue());> > }> > }> }> |
Výstup:
a:100 b:200 c:300 d:400
Třídy, které implementují rozhraní mapy, jsou znázorněny na níže uvedených médiích a popsány později takto:
1. HashMap
HashMap je součástí kolekce Java od verze Java 1.2. Poskytuje základní implementaci mapového rozhraní Java. Ukládá data v párech (klíč, hodnota). Chcete-li získat přístup k hodnotě, musíte znát její klíč. Tato třída používá techniku zvanou Java
// Java Program to illustrate the Hashmap Class> > // Importing required classes> import> java.util.*;> > // Main class> public> class> GFG {> > > // Main driver method> > public> static> void> main(String[] args)> > {> > > // Creating an empty HashMap> > Map map => new> HashMap();> > > // Inserting entries in the Map> > // using put() method> > map.put(> 'vishal'> ,> 10> );> > map.put(> 'sachin'> ,> 30> );> > map.put(> 'vaibhav'> ,> 20> );> > > // Iterating over Map> > for> (Map.Entry e : map.entrySet())> > > // Printing key-value pairs> > System.out.println(e.getKey() +> > + e.getValue());> > }> }> |
Výstup
vaibhav 20 vishal 10 sachin 30
2. LinkedHashMap
LinkedHashMap je stejně jako HashMap s další funkcí udržování pořadí prvků vložených do něj. HashMap poskytla výhodu rychlého vkládání, vyhledávání a mazání, ale nikdy neudržovala stopu a pořadí vkládání, které poskytuje LinkedHashMap, kde lze přistupovat k prvkům v jejich pořadí vložení. Podívejme se, jak pomocí této třídy vytvořit objekt mapy.
Příklad
Jáva
// Java Program to Illustrate the LinkedHashmap Class> > // Importing required classes> import> java.util.*;> > // Main class> public> class> GFG {> > > // Main driver method> > public> static> void> main(String[] args)> > {> > > // Creating an empty LinkedHashMap> > Map map => new> LinkedHashMap();> > > // Inserting pair entries in above Map> > // using put() method> > map.put(> 'vishal'> ,> 10> );> > map.put(> 'sachin'> ,> 30> );> > map.put(> 'vaibhav'> ,> 20> );> > > // Iterating over Map> > for> (Map.Entry e : map.entrySet())> > > // Printing key-value pairs> > System.out.println(e.getKey() +> > + e.getValue());> > }> }> |
Výstup
vishal 10 sachin 30 vaibhav 20
3. Stromová mapa
The TreeMap v Javě se používá k implementaci rozhraní Map a NavigableMap spolu s abstraktní třídou. Mapa je setříděna podle přirozeného pořadí svých klíčů nebo pomocí komparátoru poskytnutého při 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. Podívejme se, jak pomocí této třídy vytvořit objekt mapy.
Příklad
Jáva
// Java Program to Illustrate TreeMap Class> > // Importing required classes> import> java.util.*;> > // Main class> public> class> GFG {> > > // Main driver method> > public> static> void> main(String[] args)> > {> > > // Creating an empty TreeMap> > Map map => new> TreeMap();> > > // Inserting custom elements in the Map> > // using put() method> > map.put(> 'vishal'> ,> 10> );> > map.put(> 'sachin'> ,> 30> );> > map.put(> 'vaibhav'> ,> 20> );> > > // Iterating over Map using for each loop> > for> (Map.Entry e : map.entrySet())> > > // Printing key-value pairs> > System.out.println(e.getKey() +> > + e.getValue());> > }> }> |
Výstup
sachin 30 vaibhav 20 vishal 10
Provádění operací pomocí Mapové rozhraní a Třída HashMap
Protože Map je rozhraní, lze jej použít pouze s třídou, která toto rozhraní implementuje. Nyní se podívejme, jak provést několik často používaných operací na mapě pomocí široce používaných Třída HashMap . A také po zavedení Generika v Javě 1.5 je možné omezit typ objektu, který lze do mapy uložit.
1. Přidávání prvků
K přidání prvku do mapy můžeme použít metodu put() . Pořadí vložení však není v hashmap zachováno. Interně je pro každý prvek vygenerován samostatný hash a prvky jsou indexovány na základě tohoto hashu, aby byl efektivnější.
Příklad
Jáva
// Java program to demonstrate> // the working of Map interface> > import> java.util.*;> class> GFG {> > public> static> void> main(String args[])> > {> > // Default Initialization of a> > // Map> > Map hm1 => new> HashMap();> > > // Initialization of a Map> > // using Generics> > Map hm2> > => new> HashMap();> > > // Inserting the Elements> > hm1.put(> 1> ,> 'Geeks'> );> > hm1.put(> 2> ,> 'For'> );> > hm1.put(> 3> ,> 'Geeks'> );> > > hm2.put(> new> Integer(> 1> ),> 'Geeks'> );> > hm2.put(> new> Integer(> 2> ),> 'For'> );> > hm2.put(> new> Integer(> 3> ),> 'Geeks'> );> > > System.out.println(hm1);> > System.out.println(hm2);> > }> }> |
Výstup
{1=Geeks, 2=For, 3=Geeks} {1=Geeks, 2=For, 3=Geeks} 2. Změna prvku
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 v mapě jsou indexovány pomocí klíčů, lze hodnotu klíče změnit jednoduchým vložením aktualizované hodnoty klíče, který chceme změnit.
Příklad
Jáva
// Java program to demonstrate> // the working of Map interface> > import> java.util.*;> class> GFG {> > public> static> void> main(String args[])> > {> > > // Initialization of a Map> > // using Generics> > Map hm1> > => new> HashMap();> > > // Inserting the Elements> > hm1.put(> new> Integer(> 1> ),> 'Geeks'> );> > hm1.put(> new> Integer(> 2> ),> 'Geeks'> );> > hm1.put(> new> Integer(> 3> ),> 'Geeks'> );> > > System.out.println(> 'Initial Map '> + hm1);> > > hm1.put(> new> Integer(> 2> ),> 'For'> );> > > System.out.println(> 'Updated Map '> + hm1);> > }> }> |
Výstup
Initial Map {1=Geeks, 2=Geeks, 3=Geeks} Updated Map {1=Geeks, 2=For, 3=Geeks} 3. Odebrání prvků
K odstranění prvku z mapy můžeme použít metodu remove() . Tato metoda převezme hodnotu klíče a odstraní mapování pro klíč z této mapy, pokud je v mapě přítomen.
Příklad
Jáva
// Java program to demonstrate> // the working of Map interface> > import> java.util.*;> class> GFG {> > > public> static> void> main(String args[])> > {> > > // Initialization of a Map> > // using Generics> > Map hm1> > => new> HashMap();> > > // Inserting the Elements> > hm1.put(> new> Integer(> 1> ),> 'Geeks'> );> > hm1.put(> new> Integer(> 2> ),> 'For'> );> > hm1.put(> new> Integer(> 3> ),> 'Geeks'> );> > hm1.put(> new> Integer(> 4> ),> 'For'> );> > > // Initial Map> > System.out.println(hm1);> > > hm1.remove(> new> Integer(> 4> ));> > > // Final Map> > System.out.println(hm1);> > }> }> |
Výstup
{1=Geeks, 2=For, 3=Geeks, 4=For} {1=Geeks, 2=For, 3=Geeks} 4. Iterace přes mapu
Mapu lze iterovat několika způsoby. Nejznámějším způsobem je použít smyčku for-each a získat klíče. Hodnota klíče se zjistí pomocí metody getValue().
Příklad
Jáva
// Java program to demonstrate> // the working of Map interface> > import> java.util.*;> class> GFG {> > public> static> void> main(String args[])> > {> > > // Initialization of a Map> > // using Generics> > Map hm1> > => new> HashMap();> > > // Inserting the Elements> > hm1.put(> new> Integer(> 1> ),> 'Geeks'> );> > hm1.put(> new> Integer(> 2> ),> 'For'> );> > hm1.put(> new> Integer(> 3> ),> 'Geeks'> );> > > for> (Map.Entry mapElement : hm1.entrySet()) {> > int> key = (> int> )mapElement.getKey();> > > // Finding the value> > String value = (String)mapElement.getValue();> > > System.out.println(key +> ' : '> + value);> > }> > }> }> |
Výstup
1 : Geeks 2 : For 3 : Geeks
5. Spočítejte výskyt čísel pomocí Hashmap
V tomto kódu používáme putIfAbsent( ) spolu s Collections.frequency() spočítat přesný výskyt čísel. V mnoha programech musíte počítat výskyt určitého čísla nebo písmena. K řešení těchto typů problémů používáte následující přístup
Jáva
// Java program to Count the Occurrence> // of numbers using Hashmap> import> java.util.*;> > class> HelloWorld {> > public> static> void> main(String[] args)> > {> > int> a[] = {> 1> ,> 13> ,> 4> ,> 1> ,> 41> ,> 31> ,> 31> ,> 4> ,> 13> ,> 2> };> > > // put all elements in arraylist> > ArrayList aa => new> ArrayList();> > for> (> int> i => 0> ; i aa.add(a[i]); } HashMap h = new HashMap(); // counting occurrence of numbers for (int i = 0; i h.putIfAbsent(aa.get(i), Collections.frequency( aa, aa.get(i))); } System.out.println(h); } }> |
Výstup
{1=2, 2=1, 4=2, 41=1, 13=2, 31=2} Nejčastější dotazy v rozhraní Java Map
Q1. Co je mapové rozhraní v Javě?
Odpovědět:
Mapa obsahuje páry klíč-hodnota, kde k prvkům v mapě přistupujeme pomocí klíčových hodnot.
Q2. Jaké jsou typy mapových rozhraní v Javě?
Odpovědět:
Existují 3 implementace mapového rozhraní HashMap, LinkedHashMap a TreeMap.