CodeGym /Java Blog /अनियमित /हैश मैप: यह किस प्रकार का नक्शा है?
John Squirrels
स्तर 41
San Francisco

हैश मैप: यह किस प्रकार का नक्शा है?

अनियमित ग्रुप में प्रकाशित
नमस्ते! इस पाठ में, हम जावा हैश मैप की गहन समीक्षा करेंगे । पहले, हमने डेटा संरचनाओं का अध्ययन किया है जहाँ तत्व स्वयं के रूप में संग्रहीत होते हैं। एक सरणी या एक ArrayList / LinkedList में , हम कुछ तत्वों को संग्रहित करते हैं। लेकिन क्या होगा अगर हमारा काम थोड़ा बदल जाए?
हैश मैप: यह किस प्रकार का नक्शा है?  - 1
निम्नलिखित कार्य की कल्पना करें: 100 लोगों की एक सूची बनाएं जिसमें प्रत्येक व्यक्ति का नाम और पासपोर्ट नंबर संग्रहीत हो। सिद्धांत रूप में, यह इतना मुश्किल नहीं है। उदाहरण के लिए, आप दोनों को एक स्ट्रिंग में भर सकते हैं, और फिर इन स्ट्रिंग्स की एक सूची बना सकते हैं: "अमेलिया एगुइलर, 4211 717171"। लेकिन इस समाधान में दो कमियां हैं। सबसे पहले, हमें पासपोर्ट नंबर द्वारा खोजने की क्षमता की आवश्यकता हो सकती है। और यह सूचना भंडारण प्रारूप को देखते हुए समस्याग्रस्त हो जाएगा। दूसरा, एक ही पासपोर्ट नंबर वाले दो अलग-अलग लोगों को पैदा करने से हमें कोई नहीं रोकता। और यह हमारे समाधान की सबसे गंभीर कमी है। इसकी अनुमति कभी नहीं दी जानी चाहिए: किन्हीं भी दो लोगों का पासपोर्ट नंबर एक जैसा नहीं होता है। एक नई डेटा संरचना हमारी सहायता के लिए आती है: मानचित्र. इसे "सहयोगी सरणी" के रूप में भी जाना जाता है, लेकिन इस शब्द का प्रयोग शायद ही कभी किया जाता है। अधिक सामान्यतः, इसे "शब्दकोश" या "नक्शा" कहा जाता है। :) यह उन डेटा संरचनाओं से मौलिक रूप से भिन्न कैसे है, जिन पर हमने पहले विचार किया था? इन सबसे ऊपर, इस तथ्य में कि मानचित्र में डेटा को कुंजी-मूल्य जोड़े के रूप में संग्रहीत किया जाता है। कुछ भी कुंजियों और मूल्यों के रूप में काम कर सकता है: संख्याएँ, तार या अन्य वर्गों की वस्तुएँ। आज हम मानचित्र वर्ग के सबसे सामान्य कार्यान्वयन का अध्ययन करेंगे : जावा हैश मैपहैश मैप: यह किस प्रकार का नक्शा है?  - 2

तो, जावा में हैश मैप के बारे में हमें क्या जानने की ज़रूरत है?

इसे बनाना बहुत ही आसान है:

public static void main(String[] args) {
   HashMap<Integer, String> passportsAndNames = new HashMap<>();
}
यहां हम एक शब्दकोश बनाते हैं जो तत्वों को "नंबर-स्ट्रिंग" जोड़े के रूप में संग्रहीत करता है। संख्या कुंजी के रूप में कार्य करेगी, और स्ट्रिंग मान के रूप में कार्य करेगी। हम कुंजी प्रकार (पूर्णांक) और मान प्रकार (स्ट्रिंग) भी निर्दिष्ट करते हैं। क्यों? सबसे पहले, एक हैश मैप कुंजी हमेशा अद्वितीय होती है। यह हमें पूरी तरह से सूट करता है, क्योंकि हम पासपोर्ट नंबर को कुंजी के रूप में उपयोग कर सकते हैं और डुप्लीकेट से बच सकते हैं। मान पूरे नाम के साथ एक स्ट्रिंग होगा (अलग-अलग लोगों का एक ही नाम हो सकता है; हमारे लिए चिंता करने की कोई बात नहीं है)। हैश मैप में एक नई जोड़ी जोड़ना इस तरह दिखता है:

public class Main {

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

       passportsAndNames.put (212133, "Bridget Logan");
       passportsAndNames.put (162348, "Ivan the Great");
       passportsAndNames.put(8082771, "Donald John Trump");
       System.out.println(passportsAndNames);
   }
}
हम इसके लिए पुट () विधि का उपयोग करते हैं । इसके अलावा, हैश मैप toString() विधि को ओवरराइड करता है , इसलिए इसे कंसोल पर प्रदर्शित किया जा सकता है। आउटपुट इस तरह दिखेगा: {212133=ब्रिजेट लोगान, 8082771=डोनाल्ड जॉन ट्रम्प, 162348=इवान द ग्रेट} अब देखते हैं कि क्या चाबियां वास्तव में अद्वितीय हैं? आइए एक कुंजी के साथ एक नया तत्व जोड़ने का प्रयास करें जो मानचित्र में पहले ही उपयोग किया जा चुका है:

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

   passportsAndNames.put (212133, "Bridget Logan");
   passportsAndNames.put (162348, "Ivan the Great");
   passportsAndNames.put(8082771, "Donald John Trump");
   passportsAndNames.put(162348, "Albert Kent");// This key has already been used
   System.out.println(passportsAndNames);
}
आउटपुट: {212133=ब्रिजेट लोगान, 8082771=डोनाल्ड जॉन ट्रम्प, 162348=अल्बर्ट केंट} जैसा कि आप देख सकते हैं, कुंजी 162348 से जुड़ा पिछला मान ओवरराइट किया गया था। हम "कुंजी" शब्द का उपयोग किसी कारण से करते हैं। हैश मैप में मूल्यों को कुंजी का उपयोग करके एक्सेस किया जाता है, लेकिन दूसरी तरफ नहीं। मान का उपयोग करके कुंजी प्राप्त नहीं की जा सकती, क्योंकि मान अद्वितीय नहीं हो सकते। हैश मैप से तत्व प्राप्त करने या निकालने पर यह स्पष्ट रूप से देखा जा सकता है :

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

   passportsAndNames.put (212133, "Bridget Logan");
   passportsAndNames.put (162348, "Ivan the Great");
   passportsAndNames.put(8082771, "Donald John Trump");

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

   passportsAndNames.remove(162348);
   System.out.println(passportsAndNames);
}
एक मूल्य प्राप्त करने या शब्दकोश से एक जोड़ी को हटाने के लिए, हमें प्राप्त करने के लिए पास होना चाहिए () और निकालें () अद्वितीय कुंजी जो मूल्य से मेल खाती है। सरणी और सूचियों के विपरीत, जावा में हैश मैप में कोई संख्यात्मक सूचकांक नहीं है: कुंजी का उपयोग करके मानों तक पहुंचा जा सकता है। कंसोल आउटपुट: ब्रिजेट लोगान {212133=ब्रिजेट लोगान, 8082771=डोनाल्ड जॉन ट्रम्प} ArrayList और LinkedList वर्ग हमें यह जाँचने देते हैं कि सूची में कोई विशेष तत्व है या नहीं जावा हैश मैप हमें ऐसा करने देता है। क्या अधिक है, हम जोड़ी के दोनों सदस्यों के लिए यह कर सकते हैं: यह है कि इसमें शामिल है () (एक कुंजी के लिए जांच) और शामिल वैल्यू ()(एक मूल्य के लिए जाँच) विधियों के लिए हैं।

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

   passportsAndNames.put (212133, "Bridget Logan");
   passportsAndNames.put (162348, "Ivan the Great");
   passportsAndNames.put(8082771, "Donald John Trump");

   System.out.println(passportsAndNames.containsKey(11111));
   System.out.println(passportsAndNames.containsValue("Donald John Trump"));
}
आउटपुट: गलत सच जावा में हैश मैप की एक और सुविधाजनक विशेषता यह तथ्य है कि आप सभी चाबियों और सभी मूल्यों की अलग-अलग सूचियां प्राप्त कर सकते हैं। यह keySet() और value() विधियों के साथ पूरा किया गया है:

public class Main {

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

       passportsAndNames.put (212133, "Bridget Logan");
       passportsAndNames.put (162348, "Ivan the Great");
       passportsAndNames.put(8082771, "Donald John Trump");

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

       ArrayList<String> values = new ArrayList<>(passportsAndNames.values());
       System.out.println("Values: " + values);
   }
}
चाबियाँ एक सेट में निकाली जाती हैं , जिसे हमने अभी तक कवर नहीं किया है। यह इस मायने में खास है कि इसमें दोहराए जाने वाले तत्व नहीं हो सकते। अब मुख्य बात यह याद रखना है कि सभी चाबियों की सूची को हैश मैप से एक अलग संग्रह में पुनर्प्राप्त किया जा सकता है। उदाहरण में, हमने मानों को सामान्य ArrayList में सहेजा है । कंसोल आउटपुट: कुंजियाँ: [212133, 8082771, 162348] मान: [ब्रिजेट लोगान, डोनाल्ड जॉन ट्रम्प, इवान द ग्रेट] आकार () और स्पष्ट () विधियाँ बिल्कुल वही काम करती हैं जैसा कि पिछली संरचनाओं में हमने चर्चा की है: पहला शब्दकोश में वर्तमान में तत्वों की संख्या लौटाता है, दूसरा सभी तत्वों को हटा देता है।

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

   passportsAndNames.put (212133, "Bridget Logan");
   passportsAndNames.put (162348, "Ivan the Great");
   passportsAndNames.put(8082771, "Donald John Trump");

   System.out.println(passportsAndNames.size());
   passportsAndNames.clear();
   System.out.println(passportsAndNames);
}
आउटपुट: 3 {} यह जांचने के लिए कि हमारे हैश मैप में कम से कम एक तत्व है या नहीं , हम isEmpty() विधि का उपयोग कर सकते हैं:

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

   passportsAndNames.put (212133, "Bridget Logan");
   passportsAndNames.put (162348, "Ivan the Great");
   passportsAndNames.put(8082771, "Donald John Trump");

   if (!passportsAndNames.isEmpty()) {

       System.out.println(passportsAndNames);
   }
}
आउटपुट: {212133=ब्रिजेट लोगान, 8082771=डोनाल्ड जॉन ट्रम्प, 162348=इवान द ग्रेट} अब हम प्रारंभिक जांच के बाद ही कंसोल को आउटपुट देंगे। :) एक और दिलचस्प बात यह है कि दो मैप्स को एक में जोड़ा जा सकता है। यह putAll() विधि का उपयोग करके पूरा किया गया। हम इसे पहले हैश मैप पर कॉल करते हैं, दूसरे को तर्क के रूप में पास करते हैं, और दूसरे से तत्व पहले में जोड़े जाते हैं:

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

   passportsAndNames.put (212133, "Bridget Logan");
   passportsAndNames.put (162348, "Ivan the Great");
   passportsAndNames.put(8082771, "Donald John Trump");

   passportsAndNames2.put(917352, "Clifford Patrick");
   passportsAndNames2.put(925648, "Mitchell Salgado");

   passportsAndNames.putAll(passportsAndNames2);
   System.out.println(passportsAndNames);
}
आउटपुट: {917352=क्लिफर्ड पैट्रिक, 212133=ब्रिजेट लोगन, 8082771=डोनाल्ड जॉन ट्रम्प, 925648=मिशेल सल्गाडो, 162348=इवान द ग्रेट} पासपोर्ट्सएंडनाम्स 2 में सभी जोड़ियों को पासपोर्ट्सएंडनाम्स में कॉपी किया गया है । अब एक और जटिल उदाहरण पर विचार करें। विशेष रूप से, एक लूप में हैश मैप पर पुनरावृति ।

for (Map.Entry<Integer, String> entry: passportsAndNames.entrySet()) {
   System.out.println(entry);
}
Map.Entry क्लास डिक्शनरी के अंदर की-वैल्यू पेयर को दर्शाता है entrySet () विधि हमारे हैश मैप में सभी जोड़ों की सूची लौटाती है । क्योंकि हमारे मानचित्र में ये मानचित्र शामिल हैं । प्रवेश जोड़े, हम जोड़े पर पुनरावृति कर रहे हैं, अलग-अलग कुंजी या मान नहीं। आउटपुट: 212133=ब्रिजेट लोगन 8082771=डोनाल्ड जॉन ट्रम्प 162348=इवान द ग्रेट इसके अलावा, हैश मैप के लिए आधिकारिक ओरेकल दस्तावेज का अध्ययन करना न भूलें ।
टिप्पणियां
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION