{"id":1434,"date":"2015-05-26T23:31:49","date_gmt":"2015-05-26T21:31:49","guid":{"rendered":"http:\/\/www.webotlet.hu\/?p=1434"},"modified":"2018-02-13T08:07:39","modified_gmt":"2018-02-13T07:07:39","slug":"java-programozas-24-asszociativ-tomb-avagy-rugalmas-parok","status":"publish","type":"post","link":"https:\/\/www.webotlet.hu\/?p=1434","title":{"rendered":"Java programoz\u00e1s 24. &#8211; asszociat\u00edv t\u00f6mb avagy rugalmas p\u00e1rok"},"content":{"rendered":"<p>T\u00f6bb olyan feladat van, ahol nagyon hi\u00e1nyozna egy olyan adatszerkezet, ahol elemeket lehet p\u00e1rba \u00e1ll\u00edtani. J\u00f3 p\u00e9lda erre, amikor a h\u00e9t napjaihoz azt a sorsz\u00e1mot kellene hozz\u00e1rendelni, hogy a nap a h\u00e9t h\u00e1nyadik napja. Ugyan\u00edgy igaz ez a h\u00f3napokra is, amikor a h\u00f3nap neveihez kellene sorsz\u00e1mokat rendelni. Ha picit t\u00e1volabbi c\u00e9lt t\u0171z\u00fcnk ki, milyen j\u00f3 lenne egy h\u00f3napr\u00f3l egyszer\u0171en megtudni, hogy az melyik \u00e9vszakban van. Vagy \u00e9pp a ford\u00edtottja, melyik \u00e9vszakban milyen h\u00f3napok vannak.<\/p>\n<p>Term\u00e9szetesen ezen feladatok megoldhat\u00f3ak k\u00e9t t\u00f6mbbel is, ahol az azonos index\u0171 helyen l\u00e9v\u0151 elemek jelentik a p\u00e1rokat. L\u00e1ssunk erre egy p\u00e9ld\u00e1t:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\nString&#x5B;] napok = { &quot;hetfo&quot;,&quot;kedd&quot;,&quot;szerda&quot;,&quot;csutortok&quot;\r\n                   &quot;pentek&quot;,&quot;szombat&quot;,&quot;vasarnap&quot; };\r\nint&#x5B;] sorszamok = { 1,2,3,4,5,6,7 };\r\n<\/pre>\n<p>Ebben az esetben ha a szerda sorsz\u00e1m\u00e1t szeretn\u00e9nk megkapni, akkor a szerda index\u00e9nek megfelel\u0151 sz\u00e1mot kell a &#8216;sorszamok&#8217; t\u00f6mbb\u0151l megkapni.<\/p>\n<h2>Map<\/h2>\n<p>Ok\u00e9, az el\u0151z\u0151 egy kicsit er\u0151ltetett p\u00e9lda, de egynek \u00e9ppen j\u00f3. A gond az, hogy ha rendezz\u00fck az egyik t\u00f6mb\u00f6t, akkor a m\u00e1sik t\u00f6mbben is cser\u00e9ln\u00fcnk kell az elemeket, \u00e9s ugyanazokat a cser\u00e9ket kell v\u00e9grehajtani. A p\u00e1rok elvesz\u00edtik egym\u00e1st, ha csak az egyik tagj\u00e1t babr\u00e1ljuk.<\/p>\n<p>Az asszociat\u00edv t\u00f6mb\u00f6k pont az ilyen jelleg\u0171 feladatokat tudj\u00e1k nagyon megk\u00f6nny\u00edteni. A t\u00f6mbt\u0151l abban is k\u00fcl\u00f6nb\u00f6znek, hogy ennek az adatszerkezetnek nincs k\u00f6t\u00f6tt m\u00e9rete. B\u00e1rmikor le lehet k\u00e9rdezni, hogy h\u00e1ny elem van benne, de m\u00e9rethat\u00e1r nincs. V\u00e1zlatosan bemutatom a fel\u00e9p\u00edt\u00e9s\u00e9t, de fontos tudni, hogy a ([ ]) jelz\u00e9sek nem val\u00f3diak, egy m\u00e1sik programoz\u00e1si nyelvb\u0151l vettem \u0151ket, ezzel jel\u00f6l\u00f6m majd a t\u00f6mb hat\u00e1rait, aminek a neve ett\u0151l kezdve Map.<\/p>\n<p>A Map filoz\u00f3fi\u00e1ja az, hogy egyedi kulcsokat r\u00f6gz\u00edt, \u00e9s a kulcsokhoz \u00e9rt\u00e9keket p\u00e1ros\u00edt. A kett\u0151 egy\u00fctt jelent egy elemet (entry), ezek darabsz\u00e1ma adja a Map m\u00e9ret\u00e9t. A p\u00e9ld\u00e1ban a ([ ]) jelek k\u00f6z\u00f6tt tal\u00e1lhat\u00f3 a Map, ami kulcsokat, \u00e9s hozz\u00e1juk tartoz\u00f3 \u00e9rt\u00e9keket tartalmazza.<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\n(&#x5B; kulcs1 : ertek,\r\n   kulcs2 : ertek,\r\n   kulcs3 : ertek ])\r\n<\/pre>\n<p>A kulcsoknak mindenk\u00e9ppen egyedieknek kell lenni\u00fck, az \u00e9rt\u00e9kekkel kapcsolatban nincs megk\u00f6t\u00e9s. Ha m\u00e1r egy megl\u00e9v\u0151 kulccsal adn\u00e1nk hozz\u00e1 \u00faj \u00e9rt\u00e9ket, akkor a megl\u00e9v\u0151 kulcshoz tartoz\u00f3 \u00e9rt\u00e9ket cser\u00e9li ki az \u00faj \u00e9rt\u00e9kre. Ezt k\u00e9s\u0151bb ki is fogjuk haszn\u00e1lni, ak\u00e1r m\u00e1s feladatt\u00edpusban is!<\/p>\n<p>Konkr\u00e9t \u00e9rt\u00e9keket egyszer\u0171en a kulcsok alapj\u00e1n tudjuk kinyerni a map.get(kulcs) met\u00f3dussal, visszafel\u00e9 ez nem lehets\u00e9ges, vagyis m\u00e1r a t\u00e1rol\u00e1skor el kell d\u00f6ntenem, hogy melyik adat alapj\u00e1n melyiket akarom k\u00f6nnyen lek\u00e9rdezni. Maradva a h\u00f3nap &#8211; sorsz\u00e1m p\u00e9ld\u00e1n\u00e1l, a k\u00f6vetkez\u0151k k\u00e9pzelhet\u0151k el:<\/p>\n<ul>\n<li>a h\u00f3napb\u00f3l akarom egyszer\u0171bben megtudni a sorsz\u00e1m\u00e1t<\/li>\n<li>a sorsz\u00e1mb\u00f3l akarom megtudni, hogy az melyik h\u00f3nap<\/li>\n<\/ul>\n<p>A Map hasonl\u00f3an az ArrayList-hez, csak objektumokat tartalmazhat, de belerakhat\u00f3k primit\u00edv \u00e9rt\u00e9kek is (int, double, boolean, stb), a Map ezeket automatikusan burkol\u00f3 (csomagol\u00f3) oszt\u00e1lyokba helyezi. Deklar\u00e1l\u00e1sakor meg kell adni, hogy milyen oszt\u00e1ly\u00fa elemeket tartalmaz majd, de itt k\u00fcl\u00f6n kell v\u00e1lasztani a kulcsot, \u00e9s \u00e9rt\u00e9keket. A deklar\u00e1l\u00e1skor az inicializ\u00e1l\u00e1skor a t\u00edpusokat m\u00e1r nem kell megism\u00e9telni, itt is haszn\u00e1lhat\u00f3 az ArrayList lecke v\u00e9ge fel\u00e9 ismertetett <a href=\"http:\/\/www.webotlet.hu\/?p=775#diamond\">diamond oper\u00e1tor<\/a>.<\/p>\n<p>Olyan oszt\u00e1lyt, hogy Map soha nem p\u00e9ld\u00e1nyos\u00edthatsz. Ez egy gy\u0171jt\u0151neve azoknak az oszt\u00e1lyoknak, melyek kulcs-\u00e9rt\u00e9k p\u00e1rokat tartalmaznak, de ezek a specializ\u00e1lt oszt\u00e1lyok a konkr\u00e9t megval\u00f3s\u00edt\u00e1sban elt\u00e9rnek egym\u00e1st\u00f3l.<\/p>\n<p>L\u00e1ssuk mik azok a fontosabb oszt\u00e1lyok, melyek ilyen feladatra haszn\u00e1lhat\u00f3ak:<\/p>\n<h2>Map oszt\u00e1lyok<\/h2>\n<p>Az oszt\u00e1lyhierarchia szerint a Map al\u00e1 a k\u00f6vetkez\u0151 oszt\u00e1lyok tartoznak:<\/p>\n<ul>\n<li>HashMap &#8211; nem garant\u00e1lt a behelyezett elemek sorrendje, egyetlen null kulcs \u00e9s tetsz\u0151leges null \u00e9rt\u00e9k l\u00e9tezhet<\/li>\n<li>LinkedHashMap &#8211; az elemek behelyez\u00e9si sorrendj\u00e9t megtartja<\/li>\n<li>TreeMap &#8211; kulcs szerint rendezett (\u00e9kezetes karaktereket a sor v\u00e9g\u00e9re teszi)<\/li>\n<li>HashTable &#8211; t\u00f6bbsz\u00e1l\u00fa v\u00e9grehajt\u00e1sra felk\u00e9sz\u00edtett, nincs null kulcs \u00e9s \u00e9rt\u00e9k<\/li>\n<\/ul>\n<p>A tov\u00e1bbiakban csak az els\u0151 h\u00e1rom oszt\u00e1llyal foglalkozok.<\/p>\n<h4>HashMap<\/h4>\n<p>L\u00e1ssuk a k\u00f6vetkez\u0151 feladatot: \u00c1ll\u00edtsunk p\u00e1rba kuty\u00e1kat \u00e9s gazd\u00e1kat, ahol ezek neveit t\u00e1roljuk.<\/p>\n<pre class=\"brush: java; gutter: true; highlight: [4]; title: ; notranslate\" title=\"\">\r\nimport java.util.HashMap;\r\n...\r\n...\r\nHashMap&lt;String,String&gt; hmap = new HashMap&lt;&gt;();\r\nhmap.put(&quot;Janos&quot;,&quot;Bordi&quot;);\r\nhmap.put(&quot;Bela&quot;,&quot;Cezar&quot;);\r\nhmap.put(&quot;Aniko&quot;,&quot;Hektor&quot;);\r\nhmap.put(&quot;Agnes&quot;,&quot;Cezar&quot;);\r\nhmap.put(&quot;Jozsef&quot;,&quot;Csibesz&quot;);\r\n\r\nfor( String s : hmap.keySet() )\r\n{\r\n\u00a0 System.out.println( s+&quot;: &quot;+hmap.get(s) );\r\n}\r\n<\/pre>\n<p>A program kimenete:<\/p>\n<pre>Agnes: Cezar\r\nJozsef: Csibesz\r\nBela: Cezar\r\nAniko: Hektor\r\nJanos: Bordi\r\n<\/pre>\n<p>L\u00e1thatod, hogy a kimenet sorrendje val\u00f3ban nem ugyanaz, mint amilyen sorrendben bepakoltuk az adatokat. B\u00e1rmikor megtudhatjuk, hogy kinek milyen nev\u0171 kuty\u00e1ja van, a sorrend azonban teljesen l\u00e9nyegtelen a feladat szempontj\u00e1b\u00f3l, \u00edgy nem is foglalkozunk vele. Fontos azonban, hogy nem lehet k\u00e9t azonos kulcs, vagyis azonos nev\u0171 gazd\u00e1k, de azonos nev\u0171 kuty\u00e1ja lehet k\u00e9t k\u00fcl\u00f6nb\u00f6z\u0151 gazd\u00e1nak.<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\nhmap.put(&quot;Bela&quot;,&quot;Burkus&quot;);\r\n<\/pre>\n<p>Ha egy ilyen elemeit szeretn\u00e9nk berakni, akkor a megl\u00e9v\u0151 ember kuty\u00e1j\u00e1t m\u00f3dos\u00edtan\u00e1nk Burkus-ra, nem \u00faj elemet adn\u00e1nk hozz\u00e1.<\/p>\n<p>Konkr\u00e9t gazd\u00e1hoz tartoz\u00f3 kuty\u00e1t b\u00e1rmikor megkaphatunk a hmap.get(gazda) met\u00f3dussal, de vannak olyan esetek, amikor a Map minden elem\u00e9re sz\u00fcks\u00e9g\u00fcnk van, vagyis szeretn\u00e9nk az adatszerkezetet bej\u00e1rni. Ezekben az esetekben foreach ciklust haszn\u00e1lhatunk. Nincs indexel\u00e9s, nincsen elem sorrend, kulcsok halmaza van melyet b\u00e1rmikor megkaphatunk a map.keySet() met\u00f3dussal. Ez a halmaz foreach ciklus \u00e1ltal bej\u00e1rhat\u00f3, amely egyes\u00e9vel v\u00e9gigl\u00e9pked a halmaz elemein, vagyis a kulcsokon. A kulcsokhoz tartoz\u00f3 \u00e9rt\u00e9keket a ciklus k\u00f6zben b\u00e1rmikor megkaphatod a map.get(kulcs) met\u00f3dussal. Van olyan ki\u00edrat\u00e1s is, amikor magukat a Map elemeket, vagyis a kulcs-\u00e9rt\u00e9k p\u00e1rokat k\u00f6zvetlen\u00fcl is el\u00e9rhetj\u00fck, err\u0151l egy picit k\u00e9s\u0151bb.<\/p>\n<p>\u00c1lljon itt akkor egy m\u00e1sik p\u00e9lda is, amikor a h\u00e9t napjaihoz rendel\u00fcnk sorsz\u00e1mokat:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\nimport java.util.HashMap;\r\n...\r\n...\r\nHashMap&lt;String,Integer&gt; hmap = new HashMap&lt;&gt;();\r\nhmap.put(&quot;hetfo&quot;,1);\r\nhmap.put(&quot;kedd&quot;,2);\r\nhmap.put(&quot;szerda&quot;,3);\r\nhmap.put(&quot;csutortok&quot;,4);\r\nhmap.put(&quot;pentek&quot;,5);\r\nhmap.put(&quot;szombat&quot;,6);\r\nhmap.put(&quot;vasarnap&quot;,7);\r\n\r\nfor( String s : hmap.keySet() )\r\n{\r\n\u00a0 System.out.println( s+&quot;: &quot;+hmap.get(s) );\r\n}\r\n<\/pre>\n<h4>LinkedHashMap<\/h4>\n<p>Az el\u0151z\u0151 p\u00e9ld\u00e1ban szerepl\u0151 HashMap teh\u00e1t olyan esetekben haszn\u00e1lhat\u00f3, amikor egyedi adatokhoz m\u00e1s adatokat t\u00e1rs\u00edtunk, de ezeket kinyerni m\u00e1r nem az elt\u00e1rol\u00e1s sorrendj\u00e9ben szeretn\u00e9nk.<\/p>\n<p>Vannak azonban olyan esetek, amelyek kicsit kil\u00f3gnak a sorb\u00f3l: \u00c9vszakok &#8211; h\u00f3napok. Tegy\u00fck fel egy olyan adatszerkezetet szeretn\u00e9nk l\u00e9trehozni, melyben az adott \u00e9vszakhoz kapcsoln\u00e1nk a hozz\u00e1 tartoz\u00f3 h\u00f3napokat \u00fagy, hogy az \u00e9vszakok sorrendje a ki\u00edrat\u00e1skor tartsa meg a t\u00e1rol\u00e1s sorrendj\u00e9t. Az egyik k\u00fcl\u00f6nbs\u00e9g, hogy egy kulcshoz t\u00f6bb \u00e9rt\u00e9ket kell kapcsolni, hiszen egy \u00e9vszakhoz t\u00f6bb h\u00f3nap is kapcsol\u00f3dik. Az is gond, hogy a HashMap itt nem m\u0171k\u00f6dik, hiszen az a kulcsokat \u00f6sszekeveri, nem garant\u00e1lja a sorrendet. Ak\u00e1r egyetlen \u00faj elem t\u00e1rol\u00e1sa is teljesen \u00f6sszekavarhatja a megl\u00e9v\u0151ket, nem csak egyszer\u0171 besz\u00far\u00e1sk\u00e9nt m\u0171k\u00f6dik.<\/p>\n<p>Ilyenkor ilyen t\u00e1rol\u00e1si alakok k\u00e9pzelhet\u0151k el:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\n(&#x5B; januar     : tel,\r\n   februar    : tel,\r\n\u00a0\u00a0 marcius    : tavasz,\r\n\u00a0\u00a0 aprilis    : tavasz,\r\n\u00a0 \u00a0majus      : tavasz,\r\n \u00a0\u00a0junius     : nyar,\r\n\u00a0\u00a0 julius     : nyar,\r\n  \u00a0augusztus  : nyar,\r\n\u00a0\u00a0\u00a0szeptember : osz,\r\n\u00a0\u00a0\u00a0oktober    : osz,\r\n\u00a0\u00a0\u00a0november   : osz,\r\n\u00a0\u00a0\u00a0december   : tel ])\r\n<\/pre>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\n(&#x5B; tel :    { december, januar, februar },\r\n   tavasz : { marcius, aprilis, majus },\r\n   nyar :   { junius, julius, augusztus },\r\n   osz :    { szeptember, oktober, november } ])\r\n<\/pre>\n<p>Ezekben az esetekben teh\u00e1t j\u00f3 lenne, ha megtarthatn\u00e1nk a sorrendet, l\u00e1ssunk akkor erre is egy p\u00e9ld\u00e1t:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\npackage webotlet_linkedhashmap;\r\n...\r\n...\r\nLinkedHashMap&lt;String,String&gt; lhmap = new LinkedHashMap&lt;&gt;();\r\nlhmap.put(&quot;januar&quot;,&quot;tel&quot;);\r\nlhmap.put(&quot;februar&quot;,&quot;tel&quot;);\r\nlhmap.put(&quot;marcius&quot;,&quot;tavasz&quot;);\r\nlhmap.put(&quot;aprilis&quot;,&quot;tavasz&quot;);\r\nlhmap.put(&quot;majus&quot;,&quot;tavasz&quot;);\r\nlhmap.put(&quot;junius&quot;,&quot;nyar&quot;);\r\nlhmap.put(&quot;julius&quot;,&quot;nyar&quot;);\r\nlhmap.put(&quot;augusztus&quot;,&quot;nyar&quot;);\r\nlhmap.put(&quot;szeptember&quot;,&quot;osz&quot;);\r\nlhmap.put(&quot;oktober&quot;,&quot;osz&quot;);\r\nlhmap.put(&quot;november&quot;,&quot;osz&quot;);\r\nlhmap.put(&quot;december&quot;,&quot;tel&quot;);\r\n\r\nfor( String s : lhmap.keySet() )\r\n{\r\n\u00a0 System.out.println( s+&quot;: &quot;+lhmap.get(s) );\r\n}\r\n<\/pre>\n<p>L\u00e1thatod, hogy a t\u00e1rolt adatokat a t\u00e1rol\u00e1s sorrendj\u00e9ben kaptad vissza, vagyis a LinkedHashMap val\u00f3ban meg\u0151rzi az elemek sorrendj\u00e9t. Mi van akkor, ha \u00e9vszakokhoz rendelj\u00fck a h\u00f3napokat?<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\npackage webotlet_linkedhashmap;\r\n...\r\n...\r\nLinkedHashMap&lt;String,String&#x5B;]&gt; lhmap = new LinkedHashMap&lt;&gt;();\r\n\/\/ eloszor hozzaadom az ures evszakokat,\r\n\/\/ ezzel biztositom a sorrendjuket\r\nlhmap.put(&quot;tel&quot;, new String&#x5B;3]);\r\nlhmap.put(&quot;tavasz&quot;, new String&#x5B;3]);\r\nlhmap.put(&quot;nyar&quot;, new String&#x5B;3]);\r\nlhmap.put(&quot;osz&quot;, new String&#x5B;3]);\r\n\r\n\/\/ a evszakokhoz darabonkent hozzaadom a megfelelo honapokat\r\nlhmap.get(&quot;tel&quot;)&#x5B;0] = &quot;december&quot;;\r\nlhmap.get(&quot;tel&quot;)&#x5B;1] = &quot;januar&quot;;\r\nlhmap.get(&quot;tel&quot;)&#x5B;2] = &quot;februar&quot;;\r\n\r\nlhmap.get(&quot;tavasz&quot;)&#x5B;0] = &quot;marcius&quot;;\r\nlhmap.get(&quot;tavasz&quot;)&#x5B;1] = &quot;aprilis&quot;;\r\nlhmap.get(&quot;tavasz&quot;)&#x5B;2] = &quot;majus&quot;;\r\n\r\nlhmap.get(&quot;nyar&quot;)&#x5B;0] = &quot;junius&quot;;\r\nlhmap.get(&quot;nyar&quot;)&#x5B;1] = &quot;julius&quot;;\r\nlhmap.get(&quot;nyar&quot;)&#x5B;2] = &quot;augusztus&quot;;\r\n\r\nlhmap.get(&quot;osz&quot;)&#x5B;0] = &quot;szeptember&quot;;\r\nlhmap.get(&quot;osz&quot;)&#x5B;1] = &quot;oktober&quot;;\r\nlhmap.get(&quot;osz&quot;)&#x5B;2] = &quot;november&quot;;\r\n\r\nStringBuilder sb = new StringBuilder();\r\nfor (String s : lhmap.keySet())\r\n{\r\n\u00a0 for( String ho : lhmap.get(s) )\r\n\u00a0 {\r\n\u00a0\u00a0\u00a0 sb.append(ho+&quot; &quot;);\r\n\u00a0 }\r\n\u00a0 System.out.println(s + &quot;: &quot; + sb);\r\n\u00a0 sb.setLength(0);\r\n}\r\n<\/pre>\n<p>A Map elemeinek felt\u00f6lt\u00e9se csak egyes\u00e9vel egyedileg t\u00f6rt\u00e9nhet, el\u0151re megadott liter\u00e1llal nem lehet megoldani. Esetleg annyit lehetne m\u00e9g tr\u00fckk\u00f6zni, hogy az \u00e9vszakok t\u00f6mbjeit k\u00fcl\u00f6n liter\u00e1lk\u00e9nt megadod, \u00e9s \u00fagy \u00e1ll\u00edtod be az \u00e9vszakokhoz a h\u00f3napok t\u00f6mbjeit, de t\u00f6mb\u00f6t is csak egyszer lehet liter\u00e1llal felt\u00f6lteni, \u00edgy 4 k\u00fcl\u00f6nb\u00f6z\u0151 t\u00f6mbre lenne sz\u00fcks\u00e9ged.<\/p>\n<h4>TreeMap<\/h4>\n<p>Maradjunk a kuty\u00e1s p\u00e9ld\u00e1n\u00e1l. Szeretn\u00e9m, ha a kuty\u00e1k gazd\u00e1i n\u00e9vsorban lenn\u00e9nek t\u00e1rolva, \u00e9s ilyen sorrendben lehetne el\u0151h\u00edvni \u0151ket. A TreeMap, mint olvashattad, pont erre val\u00f3. Az egyetlen gond vele, hogy a magyar \u00e9kezetes karaktereket a z bet\u0171 ut\u00e1n kezdi list\u00e1zni. L\u00e1ssuk a p\u00e9ld\u00e1t:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\nTreeMap&lt;String,String&gt; hmap = new TreeMap&lt;&gt;();\r\nhmap.put(&quot;Janos&quot;,&quot;Bordi&quot;);\r\nhmap.put(&quot;Bela&quot;,&quot;Cezar&quot;);\r\nhmap.put(&quot;Aniko&quot;,&quot;Hektor&quot;);\r\nhmap.put(&quot;Agnes&quot;,&quot;Cezar&quot;);\r\nhmap.put(&quot;Jozsef&quot;,&quot;Csibesz&quot;);\r\n\r\nfor( String s : hmap.keySet() )\r\n{\r\nSystem.out.println( s+&quot;: &quot;+hmap.get(s) );\r\n}\r\n<\/pre>\n<p>A program kimenete:<\/p>\n<pre>Agnes: Cezar\r\nAniko: Hektor\r\nBela: Cezar\r\nJanos: Bordi\r\nJozsef: Csibesz\r\n<\/pre>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\nTreeMap&lt;Integer,String&gt; hmap = new TreeMap&lt;&gt;();\r\nhmap.put(7,&quot;vasarnap&quot;);\r\nhmap.put(1,&quot;hetfo&quot;);\r\nhmap.put(4,&quot;csutortok&quot;);\r\nhmap.put(6,&quot;szombat&quot;);\r\nhmap.put(2,&quot;kedd&quot;);\r\nhmap.put(3,&quot;szerda&quot;);\r\nhmap.put(5,&quot;pentek&quot;);\r\n\r\nfor( int i : hmap.keySet() )\r\n{\r\nSystem.out.println( i+&quot;: &quot;+hmap.get(i) );\r\n}\r\n<\/pre>\n<p>A program kimenete:<\/p>\n<pre>1: hetfo\r\n2: kedd\r\n3: szerda\r\n4: csutortok\r\n5: pentek\r\n6: szombat\r\n7: vasarnap\r\n<\/pre>\n<h2>Map met\u00f3dusok<\/h2>\n<p>A Map adatt\u00edpus, mint m\u00e1r ismertettem a hierarchia cs\u00facsa. A HashMap, LinkedHashMap \u00e9s Treemap mind bel\u0151le sz\u00e1rmazik, ezek k\u00f6z\u00f6s \u0151se. A met\u00f3dusok egy r\u00e9sze ez\u00e9rt megegyezik mindh\u00e1rom Map megval\u00f3s\u00edt\u00e1sban, l\u00e1ssuk akkor ezek felsorol\u00e1s\u00e1t.<\/p>\n<h4>Adott elem hozz\u00e1ad\u00e1sa &#8211; put( kulcs, \u00e9rt\u00e9k )<\/h4>\n<p>A Map ezzel a met\u00f3dussal t\u00f6lthet\u0151 fel, az egyes elemeket egyes\u00e9vel hozz\u00e1adhatjuk.<\/p>\n<h4>M\u00e1sik Map elemeinek hozz\u00e1ad\u00e1sa &#8211; putAll( Map )<\/h4>\n<p>Egy m\u00e1sik map elemeit bem\u00e1solhatjuk a saj\u00e1tunkba. Ez gyakorlatilag egy put() h\u00edv\u00e1st jelent a param\u00e9ter Map minden elem\u00e9re.<\/p>\n<h4>Adott \u00e9rt\u00e9k kinyer\u00e9se a kulcs \u00e1ltal &#8211; get( kulcs )<\/h4>\n<p>Visszaadja az adott, egyedi kulcshoz tartoz\u00f3 \u00e9rt\u00e9ket.<\/p>\n<h4>Adott kulcs-\u00e9rt\u00e9k p\u00e1ros elt\u00e1vol\u00edt\u00e1sa &#8211; remove( kulcs )<\/h4>\n<p>Elt\u00e1vol\u00edtja az adott kulcsot \u00e9s a hozz\u00e1tartoz\u00f3 \u00e9rt\u00e9ket, felt\u00e9ve, hogy l\u00e9teznek.<\/p>\n<h4>\u00dcres a Map? &#8211; isEmpty()<\/h4>\n<p>Igazat ad, ha a Map nem tartalmaz elemeket.<\/p>\n<h4>Map m\u00e9rete &#8211; size()<\/h4>\n<p>Visszaadja, hogy a Map h\u00e1ny elemet tartalmaz.<\/p>\n<h4>Map kulcsai &#8211; keySet()<\/h4>\n<p>Visszaadja a Map kulcsainak halmaz\u00e1t, amely egy foreach ciklussal bej\u00e1rhat\u00f3.<\/p>\n<h4>Map \u00e9rt\u00e9kei &#8211; values()<\/h4>\n<p>Visszaadja a Map \u00e9rt\u00e9keinek gy\u0171jtem\u00e9ny\u00e9t, amely egy foreach ciklussal bej\u00e1rhat\u00f3. Az \u00e9rt\u00e9kek ism\u00e9tl\u0151dhetnek, de nem fogod tudni, hogy melyik \u00e9rt\u00e9k melyik kulcshoz tartozik.<\/p>\n<h4>L\u00e9tezik-e a kulcs &#8211; containsKey( objektum )<\/h4>\n<p>Igaz \u00e9rt\u00e9ket ad, ha az adott kulcs l\u00e9tezik.<\/p>\n<h4>L\u00e9tezik-e az \u00e9rt\u00e9k &#8211; containsValue( objektum )<\/h4>\n<p>Igazat ad, ha az adott \u00e9rt\u00e9k hozz\u00e1tartozik a Map valamelyik kulcs\u00e1hoz, ak\u00e1r t\u00f6bbh\u00f6z is.<\/p>\n<h4>Map ki\u00fcr\u00edt\u00e9se &#8211; clear()<\/h4>\n<p>Elt\u00e1vol\u00edtja az adott Map teljes tartalm\u00e1t.<\/p>\n<h4>Map elemeinek kinyer\u00e9se &#8211; entrySet()<\/h4>\n<p>Visszaadja a Map elemeit olyan halmazk\u00e9nt, mely foreach ciklussal bej\u00e1rhat\u00f3. Ilyenkor a kulcsokat \u00e9s \u00e9rt\u00e9keket p\u00e1ronk\u00e9nt kapod meg, nincs sz\u00fcks\u00e9g k\u00fcl\u00f6n get() met\u00f3dusra az \u00e9rt\u00e9kek kinyer\u00e9s\u00e9hez. Ehhez a p\u00e9ld\u00e1hoz a Map oszt\u00e1lyt is import\u00e1lnod kell. Egy egyszer\u0171 p\u00e9lda. Maradjunk a HashMap p\u00e9ld\u00e1n\u00e1l, ahol a kuty\u00e1kat \u00e9s gazd\u00e1ikat kell ki\u00edratni:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\nimport java.util.Map;\r\n...\r\n...\r\nfor( Map.Entry elem : hmap.entrySet() )\r\n{\r\n\u00a0 System.out.println( elem.getKey()+&quot;: &quot;+elem.getValue() );\r\n}\r\n<\/pre>\n<p>Fontos tiszt\u00e1znunk a k\u00f6vetkez\u0151t. Ez ut\u00f3bbi p\u00e9ld\u00e1n\u00e1l ha jobban megn\u00e9zed, akkor k\u00f6zvetlen\u00fcl a Map elemeit, a p\u00e1rokat nyered ki, nem csak a kulcsot. Vagyis, amikor az adott kulcshoz tartoz\u00f3 adott \u00e9rt\u00e9ket akarod kikeresni, akkor nem is kell keresni a Map tartalm\u00e1ban, hiszen a kett\u0151t egy\u00fctt kaptad meg, p\u00e1ronk\u00e9nt. Igaz, ehhez ne felejtsd el import\u00e1lni az Map \u0151soszt\u00e1lyt.<\/p>\n<p>A fenti p\u00e9lda nem m\u0171k\u00f6dik minden esetben ilyen egyszer\u0171en. Ha megn\u00e9zed, a Map.Entry eset\u00e9ben az elemnek nem adtam meg semmilyen t\u00edpust. Hogy mi? Milyen t\u00edpust kellett volna megadnom \u00e9s minek?<\/p>\n<p>M\u00e9g mindig a kuty\u00e1s p\u00e9ld\u00e1n\u00e1l maradva, a kulcs-\u00e9rt\u00e9k p\u00e1rok az elemek csak egy\u00e9rtelm\u0171 t\u00edpusokat tartalmaznak. Az Entry t\u00edpus\u00e1t ilyenkor nem is k\u00f6telez\u0151 megadni, \u00e9n is elhagytam. De mi van akkor, ha az \u00e9rt\u00e9k mondjuk egy bonyolultabb strukt\u00fara, mondjuk egy lista. Akkor tudni fogja majd mag\u00e1t\u00f3l a ciklus, hogy az Entry pontosan mit tartalmaz? Erre a k\u00f6vetkez\u0151 feladat majd v\u00e1laszt ad, addig is \u00e1lljon itt az el\u0151z\u0151 p\u00e9lda, t\u00edpusokkal kib\u0151v\u00edtve, egy\u00e9rtelm\u0171s\u00edtve.<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\nimport java.util.Map;\r\n...\r\n...\r\nfor( Map.Entry&lt;String,String&gt; elem : hmap.entrySet() )\r\n{\r\n\u00a0 System.out.println( elem.getKey()+&quot;: &quot;+elem.getValue() );\r\n}\r\n<\/pre>\n<h2>Komplex Map p\u00e9lda<\/h2>\n<p>Tegy\u00fck fel, l\u00e9tre szeretn\u00e9nk hozni egy olyan adatszerkezetet, melyben di\u00e1kokat \u00e9s oszt\u00e1lyokat p\u00e1ros\u00edtunk aszerint, hogy a kulcs az oszt\u00e1ly neve, a hozz\u00e1 tartoz\u00f3 \u00e9rt\u00e9kek pedig az oszt\u00e1ly\u00e1ba j\u00e1r\u00f3 di\u00e1kok. Ha megtal\u00e1ljuk az adott oszt\u00e1ly oszt\u00e1lyf\u0151n\u00f6k\u00e9t is, akkor tegy\u00fck a di\u00e1kok el\u00e9. Azt is kik\u00f6tj\u00fck, hogy az oszt\u00e1lyok sorrendje fontos, ami m\u00e1r \u00f6nmag\u00e1ban is meghat\u00e1rozza, hogy melyik Map sz\u00fcks\u00e9ges a feladathoz.<\/p>\n<p>A di\u00e1kokat t\u00f6mbk\u00e9nt is t\u00e1rolhatn\u00e1nk, ilyenkor azonban tudni kellene az oszt\u00e1lyl\u00e9tsz\u00e1mot is, hiszen a t\u00f6mb m\u00e9rete fix. Fogalmunk sincs, melyik oszt\u00e1lyba h\u00e1nyan j\u00e1rnak, valamint az els\u0151 helyet az oszt\u00e1lyf\u0151n\u00f6knek kell fenntartani. Ett\u0151l a pontt\u00f3l kezdve tudjuk, hogy LinkedHashMap kell a programhoz, a kulcsok az oszt\u00e1lyok nevei lesznek, a hozz\u00e1juk tartoz\u00f3 \u00e9rt\u00e9kek pedig az oszt\u00e1lyba j\u00e1r\u00f3 di\u00e1kok list\u00e1ja, \u00e9l\u00fck\u00f6n az oszt\u00e1lyf\u0151n\u00f6kkel.<\/p>\n<p>Itt egy minta a forr\u00e1sb\u00f3l:<\/p>\n<p>Resch Nora;10B<br \/>\nBarzo Gabor;10D<br \/>\nJakab Bela;10D;OF<br \/>\nBalogh Aron;10A<br \/>\nBogar Lenard;10C<br \/>\nGergely Andras;10A;OF<br \/>\nHajos Jeno;10C<br \/>\nBodi Adrienn;10C<br \/>\n&#8230;<br \/>\n&#8230;<\/p>\n<p>A forr\u00e1st itt tal\u00e1lhatod, amit be kell olvasni, \u00e9s l\u00e9tre kell hozni egy adatszerkezetet, mely oszt\u00e1lyonk\u00e9nt tartalmazza a tanul\u00f3kat \u00fagy, hogy a tanul\u00f3k list\u00e1j\u00e1nak elej\u00e9n az adott oszt\u00e1ly oszt\u00e1lyf\u0151n\u00f6ke \u00e1ll, valahogy \u00edgy:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\n(&#x5B; &quot;10A&quot; : &#x5B;ofo, diak1, diak2, diak3, ..., diakN ],\r\n   &quot;10B&quot; : &#x5B;ofo, diak1, diak2, diak3, ..., diakN ],\r\n   ... ])\r\n<\/pre>\n<p>A forr\u00e1s, mint a mint\u00e1n l\u00e1thattad, \u00f6mlesztve tartalmazza a di\u00e1kokat \u00e9s tan\u00e1rokat. Mindenki neve m\u00f6g\u00f6tt szerepel az oszt\u00e1lya, valamint az oszt\u00e1lyf\u0151n\u00f6k\u00f6kn\u00e9l az OF megjegyz\u00e9s is. A feladat szempontj\u00e1b\u00f3l fontos t\u00e9nyez\u0151, hogy el\u0151re tudom, milyen oszt\u00e1lyok adatai szerepelnek a forr\u00e1sban: 10A, 10B, 10C, 10D!<\/p>\n<p>L\u00e1ssuk akkor a megold\u00e1st:<\/p>\n<pre class=\"brush: java; gutter: true; highlight: [16,42]; title: ; notranslate\" title=\"\">\r\n\/**\r\n\u00a0*\r\n\u00a0* @author http:\/\/webotlet.hu\r\n\u00a0*\/\r\npackage webotlet_maposztalyok;\r\n\r\nimport java.io.*;\r\nimport java.util.Map;\r\nimport java.util.LinkedHashMap;\r\nimport java.util.ArrayList;\r\n\r\npublic class Webotlet_MapOsztalyok\r\n{\r\n\u00a0 public static void main(String&#x5B;] args)\r\n\u00a0 {\r\n\u00a0\u00a0\u00a0 LinkedHashMap&lt;String,ArrayList&lt;String&gt;&gt; lhmap = new LinkedHashMap&lt;&gt;();\r\n\u00a0\u00a0\u00a0 RandomAccessFile raf;\r\n\u00a0\u00a0\u00a0 String sor;\r\n\u00a0\u00a0\u00a0 String&#x5B;] adat;\r\n\u00a0\u00a0\u00a0 try\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 raf = new RandomAccessFile(&quot;map_osztalyok.csv&quot;,&quot;r&quot;);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 lhmap.put(&quot;10A&quot;, new ArrayList&lt;String&gt;());\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 lhmap.put(&quot;10B&quot;, new ArrayList&lt;String&gt;());\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 lhmap.put(&quot;10C&quot;, new ArrayList&lt;String&gt;());\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 lhmap.put(&quot;10D&quot;, new ArrayList&lt;String&gt;());\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 for( sor = raf.readLine(); sor != null; sor = raf.readLine() )\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 adat = sor.split(&quot;;&quot;);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if( adat.length == 3 )\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 lhmap.get(adat&#x5B;1]).add(0, adat&#x5B;0]);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 else\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 lhmap.get(adat&#x5B;1]).add(adat&#x5B;0]);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 StringBuilder sb = new StringBuilder();\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 for( Map.Entry&lt;String,ArrayList&lt;String&gt;&gt; e : lhmap.entrySet() )\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 System.out.print(e.getKey()+&quot;: &quot;);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 for( String nev : e.getValue() )\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 sb.append(nev+&quot;, &quot;);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 sb.setLength(sb.length()-2);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 System.out.println(sb);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 sb.setLength(0);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0 catch( IOException e )\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 System.err.println(&quot;HIBA&quot;);\r\n\u00a0\u00a0\u00a0 }\r\n\u00a0 }\r\n}\r\n<\/pre>\n<p>V\u00e9gezet\u00fcl akkor \u00e1lljon itt az el\u0151z\u0151 fejezet k\u00e9r\u00e9s\u00e9re a v\u00e1lasz. Mit is kellett megadni az Entry t\u00edpus\u00e1nak? Pontosan az adott Map deklar\u00e1l\u00e1sakor megadott t\u00edpusokat, hogy a foreach ciklusnak gondolkodnia se kelljen, azonnal tudja, hogy mit kap. L\u00e1sd a kiemelt r\u00e9szeket.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>T\u00f6bb olyan feladat van, ahol nagyon hi\u00e1nyozna egy olyan adatszerkezet, ahol elemeket lehet p\u00e1rba \u00e1ll\u00edtani. J\u00f3 p\u00e9lda erre, amikor a h\u00e9t napjaihoz azt a sorsz\u00e1mot kellene hozz\u00e1rendelni, hogy a nap a h\u00e9t h\u00e1nyadik napja. Ugyan\u00edgy igaz ez a h\u00f3napokra is, <a class=\"more-link\" href=\"https:\/\/www.webotlet.hu\/?p=1434\">Tov\u00e1bb <span class=\"screen-reader-text\">  Java programoz\u00e1s 24. &#8211; asszociat\u00edv t\u00f6mb avagy rugalmas p\u00e1rok<\/span><span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[100],"tags":[126,127,125,129,122,86,128,123,121,143,124],"class_list":["post-1434","post","type-post","status-publish","format-standard","hentry","category-java-halado-leckek","tag-asszociativ","tag-asszociativ-tomb","tag-diamond","tag-entry","tag-hashmap","tag-java","tag-kulcs","tag-linkedhashmap","tag-map","tag-programozas","tag-treemap"],"_links":{"self":[{"href":"https:\/\/www.webotlet.hu\/index.php?rest_route=\/wp\/v2\/posts\/1434","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.webotlet.hu\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.webotlet.hu\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.webotlet.hu\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.webotlet.hu\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1434"}],"version-history":[{"count":41,"href":"https:\/\/www.webotlet.hu\/index.php?rest_route=\/wp\/v2\/posts\/1434\/revisions"}],"predecessor-version":[{"id":2282,"href":"https:\/\/www.webotlet.hu\/index.php?rest_route=\/wp\/v2\/posts\/1434\/revisions\/2282"}],"wp:attachment":[{"href":"https:\/\/www.webotlet.hu\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1434"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.webotlet.hu\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1434"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.webotlet.hu\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1434"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}