JavaRush /Блоги Java /Random-TG /HashMap дар Java - он чӣ гуна харита аст?

HashMap дар Java - он чӣ гуна харита аст?

Дар гурӯҳ нашр шудааст
Салом! Имрӯз мо дар бораи сохтори дигари додаҳо - Харита сӯҳбат хоҳем кард. Номи расмии русии он "массиви ассотсиативӣ" аст, аммо он аксар вақт истифода намешавад. Вариантҳои бештар маъмул ин "лугат", "харита" ё (аксаран) англисизми жаргонӣ "харита" мебошанд :) Дар дохor харита маълумот дар формати "калид" - "арзиш", яъне дар ҷуфтҳо нигоҳ дошта мешавад. Ҳарду калидҳо ва арзишҳо метавонанд ҳама гуна an objectҳо бошанд - рақамҳо, сатрҳо ё an objectҳои синфҳои дигар.

Чӣ тавр Харита аз дигар сохторҳои додаҳо фарқ мекунад

Пештар, мо ба сохторҳои додаҳо назар кардем, ки дар он элементҳо худашон нигоҳ дошта мешаванд. Дар массив ё ArrayList / LinkedList , мо миқдори муайяни элементҳоро нигоҳ медорем. Аммо агар вазифаи мо андаке дигар шавад-чй? Масалан, тасаввур кунед, ки мо вазифадорем, ки рӯйхати 100 нафарро тартиб диҳем, ки дар он ному насаби пурраи шахс ва рақами шиноснома нигоҳ дошта мешавад. Дар асл, он қадар душвор нест. Масалан, шумо метавонед ҳарду дар як сатр ҷойгир кунед ва чунин рӯйхати сатрҳоро эҷод кунед: "Анна Ivanовна Решетникова, 4211 717171." Аммо ин ҳалли ду камбуди дорад. Аввалан, мо шояд ба функсияи ҷустуҷӯи шиноснома ниёз дорем. Ва бо ин формати нигоҳдории иттилоот, ин мушкил хоҳад буд. Ва дуюм, чизе ба мо халал намерасонад, ки ду нафари гуногунро бо як рақами шиноснома эҷод кунем. Ва ин чиддитарин камбудии халли мост. Чунин ҳолатҳо бояд комилан истисно карда шаванд, ду нафар бо як рақами шиноснома вуҷуд надоранд. Дар ин ҷо Харита ва хусусиятҳои зикршудаи он ба кӯмаки мо меоянд (нигоҳ доштани маълумот дар як ҷуфт дар формати “калид”-”арзиш”). Биёед ба татбиқи маъмултарини Харита - синфи Java HashMap назар андозем .HashMap - ин чӣ гуна харита аст?  - 1

Эҷоди HashMap дар Java ва кор бо синф

Эҷоди ин амал хеле осон аст:
public static void main(String[] args) {

   HashMap<Integer, String> passportsAndNames = new HashMap<>();

}
Дар ин ҷо мо луғате сохтаем, ки дар он элементҳо дар формати "рақам-сатр" нигоҳ дошта мешаванд. Рақам калид хоҳад буд ва сатр арзиш хоҳад буд. Мо инчунин нишон додем, ки мо кадом намуди калидҳоро дорем ( Integer) ва кадом намуди арзишҳо ( String). Чаро ин тавр аст? Аввалан, калид дар HashMap ҳамеша беназир аст . Ин барои мо хеле хуб кор хоҳад кард, зеро мо метавонем рақами шиносномаро ҳамчун калид истифода барем ва аз такрорӣ пешгирӣ кунем. Ва хати бо номи пурра ҳамчун арзиш амал мекунад (номи пурраи одамони гуногун метавонад ба осонӣ такрор карда шавад, дар ин барои мо ҳеҷ бадӣ нест).

Илова кардани ҷуфти нав ба HashMap

Ин вазифа чунин менамояд:
public class Main {

   public static void main(String[] args) {
       HashMap<Integer, String> passportsAndNames = new HashMap<>();


       passportsAndNames.put(212133, "Lydia Arkadievna Bublikova");
       passportsAndNames.put(162348, "Ivan Mikhailovich Serebryakov");
       passportsAndNames.put(8082771, "Donald John Trump");
       System.out.println(passportsAndNames);

   }

}
Барои ин усул истифода мешавад put(). Илова бар ин, HashMap дорои усули бекоршуда мебошад toString(), то он метавонад дар консол чоп карда шавад. Натиҷа чунин хоҳад буд: {212133=Лидия Аркадьевна Бубликова, 8082771=Доналд Ҷон Трамп, 162348=Ivan Михайлович Серебряков}

Хусусиятҳои калидҳои HashMap

Акнун биёед тафтиш кунем, ки оё калидҳо воқеан беназиранд? Биёед кӯшиш кунем, ки як унсури навро бо калид дар харита илова кунем :
public static void main(String[] args) {

   HashMap<Integer, String> passportsAndNames = new HashMap<>();

   passportsAndNames.put(212133, "Lydia Arkadievna Bublikova");
   passportsAndNames.put(162348, "Ivan Mikhailovich Serebryakov");
   passportsAndNames.put(8082771, "Donald John Trump");
   passportsAndNames.put(162348, "Viktor Mikhailovich Stychkin");//repeat key

   System.out.println(passportsAndNames);

}
Натиҷа: {212133=Лидия Аркадьевна Бубликова, 8082771=Дональд Ҷон Трамп, 162348=Виктор Михайлович Стычкин} Элементи қаблӣ бо калиди 162348, тавре ки мебинед, аз нав навишта шудааст. "Калид" -ро барои як сабаб калид номиданд. Арзишҳо дар HashMap тавассути калид дастрас карда мешаванд (вале на баръакс - калидро аз рӯи арзиш ба даст овардан мумкин нест, зеро арзишҳоро такрор кардан мумкин аст). Ин дар мисолҳои гирифтани элемент ва инчунин хориҷ кардани элемент аз HashMap равшан дида мешавад:
public static void main(String[] args) {

   HashMap<Integer, String> passportsAndNames = new HashMap<>();

   passportsAndNames.put(212133, "Lydia Arkadievna Bublikova");
   passportsAndNames.put(162348, "Ivan Mikhailovich Serebryakov");
   passportsAndNames.put(8082771, "Donald John Trump");

   String lidiaName = passportsAndNames.get(212133);
   System.out.println(lidiaName);


   passportsAndNames.remove(162348);
   System.out.println(passportsAndNames);

}
Барои ба даст овардани арзиш ё нест кардани як ҷуфт аз луғат, мо бояд маҳз калиди ягонаи ба ин арзиш мувофиқро ба get()усулҳо гузаронем. Дар HashMap индексҳои ададӣ, ба монанди массивҳо ё рӯйхатҳо вуҷуд надоранд - арзиш тавассути калид дастрас карда мешавад. Баромади консол: Лидия Аркадьевна Бубликова {212133=Лидия Аркадьевна Бубликова, 8082771=Доналд Ҷон Трамп}remove()

Тафтиши мавҷудияти калид ва арзиш

Дар синфҳои ArrayList ва LinkedList , мо метавонем тафтиш кунем, ки оё рӯйхат дорои унсури мушаххас аст. HashMap инчунин ба шумо имкон медиҳад, ки ин корро кунед ва барои ҳарду қисмҳои ҷуфт: он дорои усулҳо containsKey()(мавҷудияти калид) ва containsValue()(мавҷудияти арзишро тафтиш мекунад).
public static void main(String[] args) {

   HashMap<Integer, String> passportsAndNames = new HashMap<>();

   passportsAndNames.put(212133, "Lydia Arkadievna Bublikova");
   passportsAndNames.put(162348, "Ivan Mikhailovich Serebryakov");
   passportsAndNames.put(8082771, "Donald John Trump");


   System.out.println(passportsAndNames.containsKey(11111));
   System.out.println(passportsAndNames.containsValue("Donald John Trump"));

}
Натиҷа: дурӯғ дуруст

Гирифтани рӯйхати ҳамаи калидҳо ва арзишҳо

Хусусияти дигари қулайи HashMap дар он аст, ки шумо метавонед рӯйхати ҳамаи калидҳо ва ҳамаи арзишҳоро алоҳида дастрас кунед . Барои ин усулҳо keySet()ва истифода мешаванд values():
public class Main {

   public static void main(String[] args) {

       HashMap<Integer, String> passportsAndNames = new HashMap<>();

       passportsAndNames.put(212133, "Lydia Arkadievna Bublikova");
       passportsAndNames.put(162348, "Ivan Mikhailovich Serebryakov");
       passportsAndNames.put(8082771, "Donald John Trump");

       Set<Integer> keys = passportsAndNames.keySet();
       System.out.println("Keys: " + keys);

       ArrayList<String> values = new ArrayList<>(passportsAndNames.values());
       System.out.println("Values: " + values);

   }

}
Калидҳо ба коллексия бароварда мешаванд Set. Хусусияти он дар он аст, ки он унсурҳои такроршавандаро дар бар гирифта наметавонад. Ҳоло чизи асосие, ки бояд дар хотир дошт, ин аст, ки рӯйхати ҳама калидҳоро аз HashMap ба коллексияи алоҳида гирифтан мумкин аст. Дар мисол, мо арзишҳоро ба ҳолати муқаррарӣ захира кардем ArrayList. Натиҷаи консол: Калидҳо: [212133, 8082771, 162348] Арзишҳо: [Лидия Аркадьевна Бубликова, Доналд Ҷон Трамп, Ivan Михайлович Серебряков] Усулҳо айнан ҳамон тавре ки дар сохторҳои қаблие, ки мо аз он гузаштаем, size()иҷро мекунанд clear(): якум элементҳои ададро дар луғат дар айни замон, дуюмаш ҳамаи элементҳоро нест мекунад.
public static void main(String[] args) {

   HashMap<Integer, String> passportsAndNames = new HashMap<>();

   passportsAndNames.put(212133, "Lydia Arkadievna Bublikova");
   passportsAndNames.put(162348, "Ivan Mikhailovich Serebryakov");
   passportsAndNames.put(8082771, "Donald John Trump");

   System.out.println(passportsAndNames.size());
   passportsAndNames.clear();
   System.out.println(passportsAndNames);

}
Натиҷа: 3 {} Барои санҷидани он, ки HashMap-и мо ҳадди аққал як элемент дорад, мо метавонем аз усули isEmpty():
public static void main(String[] args) {

   HashMap<Integer, String> passportsAndNames = new HashMap<>();

   passportsAndNames.put(212133, "Lydia Arkadievna Bublikova");
   passportsAndNames.put(162348, "Ivan Mikhailovich Serebryakov");
   passportsAndNames.put(8082771, "Donald John Trump");

   if (!passportsAndNames.isEmpty()) {

       System.out.println(passportsAndNames);

   }

}
Натиҷа: {212133=Лидия Аркадьевна Бубликова, 8082771=Доналд Ҷон Трамп, 162348=Ivan Михайлович Серебряков} Ҳоло мо танҳо пас аз санҷиши пешакӣ ба консол мебароем :)

Якҷоя кардани ду харита дар як

Боз як нуктаи ҷолиб ин аст, ки ду харитаро метавон дар як муттаҳид кард . Барои ин усул вуҷуд дорад putAll(). Мо онро дар HashMap аввал даъват мекунем , дуюмро ҳамчун далел мегузорем ва унсурҳои дуюм ба якум илова карда мешаванд:
public static void main(String[] args) {

   HashMap<Integer, String> passportsAndNames = new HashMap<>();
   HashMap<Integer, String> passportsAndNames2 = new HashMap<>();

   passportsAndNames.put(212133, "Lydia Arkadievna Bublikova");
   passportsAndNames.put(162348, "Ivan Mikhailovich Serebryakov");
   passportsAndNames.put(8082771, "Donald John Trump");

   passportsAndNames2.put(917352, "Alexey Andreevich Ermakov");
   passportsAndNames2.put(925648, "Maxim Olegovich Arkharov");


   passportsAndNames.putAll(passportsAndNames2);
   System.out.println(passportsAndNames);

}
Натиҷа: {917352=Алексей Андреевич Ермаков, 212133 = Лидия Аркадьевна Бубликова, 8082771=Доналд Ҷон Трамп, 925648=Максим Олегович Архаров, 162348=Ivan Михайлович Серебряков ба шиносномаҳои шиносномаҳо дохил карда шуданд . Акнун биёед як мисоли мураккабтарро дида бароем. Маҳз, аз HashMap дар як давр такрор кунед.
for (Map.Entry entry: passportsAndNames.entrySet()) {

   System.out.println(entry);

}
Интерфейс Map.Entryтанҳо маънои ҷуфти калид-арзишро дар дохor луғат дорад. Ин усул entrySet()рӯйхати ҳамаи ҷуфтҳоро дар HashMap-и мо бармегардонад (азбаски харитаи мо аз чунин ҷуфтҳои Entry иборат аст, мо бар ҷуфтҳо такрор мекунем, на калидҳо ё арзишҳои алоҳида). Хулоса: 212133=Лидия Аркадьевна Бубликова 8082771=Дональд Ҷон Трамп 162348=Ivan Михайлович Серебряков Ин мақоларо барои оянда захира кунед: https://habr.com/ru/post/128017/ Ҳоло барои хондани он барвақт аст, аммо дар оянда , вақте ки шумо бо истифодаи HashMap дастҳои худро мегиред, он ба шумо кӯмак мекунад, ки чӣ тавр ин сохтори додаҳо аз дарун кор мекунад. Инчунин, тафтиш кардани ҳуҷҷатҳои расмии Oracle дар HashMap -ро фаромӯш накунед .
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION