JavaRush /Java Blog /Random-TK /Java-da HashMap - bu nähili karta?

Java-da HashMap - bu nähili karta?

Toparda çap edildi
Salam! Bu gün başga bir maglumat gurluşy - Karta barada gürleşeris. Resmi rus ady “assosiatiw massiw”, ýöne köplenç ulanylmaýar. Has giňden ýaýran wariantlar “sözlük”, “karta” ýa-da (köplenç) slang anglikizminiň “kartasy” :) Kartanyň içinde maglumatlar “açar” - “baha” görnüşinde, ýagny jübüt görnüşde saklanýar. Iki açar we baha islendik obýekt bolup biler - sanlar, setirler ýa-da beýleki synplaryň obýektleri.

Karta beýleki maglumatlar gurluşlaryndan nähili tapawutlanýar

Ozal elementleriň özleri tarapyndan saklanýan maglumat gurluşlaryna seredýärdik. Bir massiwde ýa-da ArrayList / LinkedList- de belli bir mukdarda elementi saklaýarys. Tasköne wezipämiz azajyk üýtgese näme etmeli? Mysal üçin, adamyň doly ady we pasport belgisi saklanjak 100 adamyň sanawyny döretmek meselesi bilen ýüzbe-ýüz bolýandygymyzy göz öňüne getiriň. Aslynda beýle kyn däl. Mysal üçin, ikisine-de bir hatara gabat gelip, şuňa meňzeş setirleriň sanawyny döredip bilersiňiz: "Anna Iwanowna Reshetnikowa, 4211 717171." Emma bu çözgüdiň iki kemçiligi bar. Ilki bilen, pasport gözlemek funksiýasy gerek bolup biler. Maglumat saklamak üçin bu format bilen problemaly bolar. Ikinjiden, bir pasport belgisi bolan iki dürli adamy döretmäge hiç zat päsgel bermez. Bu çözgütimiziň iň çynlakaý kemçiligi. Şeýle ýagdaýlar düýbünden aýrylmaly, pasport belgisi bolan iki adam ýok. Bu ýerde Karta we onuň görkezilen aýratynlyklary bize kömek edýär (maglumatlary "açar" - "baha" formatda jübütde saklamak). Iň ýaýran Kartanyň ýerine ýetirilişine - Java HashMap synpyna seredeliň .HashMap - bu nähili karta?  - 1

Java-da HashMap döretmek we synp bilen işlemek

Bu durmuşa geçirmek gaty ýönekeý:
public static void main(String[] args) {

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

}
Bu ýerde elementleriň “san setiri” görnüşinde saklanjak sözlügi döretdik. San açar bolar, setir bolsa baha bolar. Şeýle hem haýsy düwmeleriň ( Integer) we haýsy bahalaryň ( String) boljakdygyny görkezdik. Näme üçin beýle? Birinjiden, “HashMap” -daky açar elmydama özboluşlydyr . Bu biziň üçin gaty peýdaly bolar, sebäbi pasport belgisini açar hökmünde ulanyp we dublikatlardan gaça durup bileris. Doly ady bolan setir bolsa gymmatlyk hökmünde hereket eder (dürli adamlaryň doly adyny aňsatlyk bilen gaýtalap bolar, bu ýerde hiç hili ýalňyşlyk ýok).

HashMap-a täze jübüt goşmak

Bu wezipe şuňa meňzeýär:
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);

   }

}
Usul munuň üçin ulanylýar put(). toString()Mundan başga-da, “HashMap” -da konsola çap etmek üçin artykmaç usul bar . Çykyş şeýle bolar: {212133 = Lidiýa Arkadýewna Bublikowa, 8082771 = Donald Jon Trump, 162348 = Iwan Mihaýlowiç Serebryakow}

“HashMap” düwmeleriniň aýratynlyklary

Indi açarlaryň hakykatdanam üýtgeşikdigini barlap göreliň? Geliň, kartada eýýäm açar bilen täze element goşmaga synanyşalyň :
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);

}
Çykyş: {212133 = Lidiýa Arkadýewna Bublikowa, 8082771 = Donald Jon Trump, 162348 = Wiktor Mihaýlowiç Stiçkin} Görşüňiz ýaly 162348 açary bolan öňki element gaýtadan ýazyldy. “Açar” bir sebäbe görä açar diýlip atlandyryldy. “HashMap” -daky bahalara açar bilen girýär (ýöne tersine däl - açary baha bilen alyp bolmaýar, sebäbi bahalar köpeldilip bilner). Bu element almak, şeýle hem bir elementi HashMap-dan aýyrmak mysallarynda aýdyň görünýär:
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);

}
Sözlükden bir bahany almak ýa-da jübüti ýok etmek üçin, bu gymmata laýyk gelýän özboluşly açary get()usullara geçirmeli. HashMap-da massiwlerde ýa-da sanawlarda bolşy ýaly san görkezijileri ýok - baha açar bilen girýär. Konsol çykyşy: Lidiýa Arkadýewna Bublikowa {212133 = Lidiýa Arkadýewna Bublikowa, 8082771 = Donald Jon Trump}remove()

Açaryň we bahanyň bardygyny barlamak

“ArrayList” we “LinkedList” sapaklarynda sanawda belli bir elementiň bardygyny ýa-da ýokdugyny barlap bilerdik. “HashMap” size muny etmäge we jübütiň iki bölegi üçin hem mümkinçilik berýär: usullary bar containsKey()(açaryň bardygyny barlamak) we containsValue()(bahanyň bardygyny barlamak).
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"));

}
Çykyş: ýalan dogry

Keyshli düwmeleriň we gymmatlyklaryň sanawyny almak

“HashMap” -yň başga bir amatly aýratynlygy , ähli düwmeleriň we ähli bahalaryň sanawyny aýratyn alyp bilersiňiz . Munuň üçin usullar keySet()we ulanylýar 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);

   }

}
Düwmeler ýygyndyda alyndy Set. Onuň aýratynlygy, gaýtalanýan elementleri öz içine alyp bilmezligi. Indi ýatda saklamaly esasy zat, ähli düwmeleriň sanawyny “HashMap” -dan aýratyn kolleksiýa alyp bolýar. Mysal üçin, bahalary kadaly ýagdaýda sakladyk ArrayList. Konsol çykyşy: Düwmeler : [212133, 8082771, 162348] Gymmatlyklar : häzirki pursatda sözlük, ikinjisi ähli elementleri pozýar. 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);

}
Çykyş: 3 { Hash HashMap-da azyndan bir elementiň bardygyny ýa-da ýokdugyny barlamak üçin usuly ulanyp bileris 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);

   }

}
Çykyş: {212133 = Lidiýa Arkadýewna Bublikowa, 8082771 = Donald Jon Trump, 162348 = Iwan Mihaýlowiç Serebryakow} Indi konsola diňe deslapky barlagdan soň çykarys :)

Iki kartany bir ýere jemlemek

Anotherene bir gyzykly zat, iki kartany bir ýere jemläp bolýar . Munuň üçin bir usul bar putAll(). Birinji HashMap -da çagyrýarys , ikinjisini argument hökmünde geçireris, ikinjisinden elementler birinjisine goşular:
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);

}
Çykyş: {917352 = Alekseý Andreýewiç Ermakow, 212133 = Lidiýa Arkadýewna Bublikowa , 8082771 = Donald Jon Trump, 925648 = Maksim Olegowiç Arharow, 162348 = Iwan Mihaýlowiç Serebryakow} Pasportlaryň ähli elementleriAndNames2 . Indi has çylşyrymly bir meselä seredeliň. Has dogrusy, “HashMap” -yň aýlawynda gaýtalaň.
for (Map.Entry entry: passportsAndNames.entrySet()) {

   System.out.println(entry);

}
Interfeýs Map.Entrydiňe sözlügiň içindäki açar bahaly jübüti aňladýar. Usul, entrySet()HashMap-daky ähli jübütleriň sanawyny yzyna gaýtaryp berýär (kartamyz diňe şeýle Giriş jübütlerinden ybarat bolany üçin, jübütleriň üstünden gaýtalaýarys, aýratyn düwmeler ýa-da bahalar däl). Netije: 212133 = Lidiýa Arkadýewna Bublikowa 8082771 = Donald Jon Trump 162348 = Iwan Mihaýlowiç Serebryakow Bu makalany geljege ýazdyryň: https://habr.com/ru/post/128017/ Indi ony okamak entek ir, ýöne geljekde , “HashMap” -y ulanjak bolanyňyzda, bu maglumat gurluşynyň içinden nähili işleýändigine düşünmäge kömek eder. Şeýle hem, HashMap-da resmi Oracle resminamalaryny barlamagy ýatdan çykarmaň .
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION