CodeGym /Java Blog /यादृच्छिक /हॅशमॅप: हा कोणत्या प्रकारचा नकाशा आहे?
John Squirrels
पातळी 41
San Francisco

हॅशमॅप: हा कोणत्या प्रकारचा नकाशा आहे?

यादृच्छिक या ग्रुपमध्ये प्रकाशित केले
हाय! या धड्यात, आम्ही Java HashMap वर जवळून पुनरावलोकन करू . पूर्वी, आम्ही डेटा स्ट्रक्चर्सचा अभ्यास केला आहे जिथे घटक स्वतःच साठवले जातात. अॅरे किंवा अॅरेलिस्ट / लिंक्डलिस्टमध्ये , आम्ही काही घटक साठवतो. पण आमचे कार्य थोडे बदलले तर?
हॅशमॅप: हा कोणत्या प्रकारचा नकाशा आहे?  - १
खालील कार्याची कल्पना करा: 100 लोकांची यादी तयार करा जी प्रत्येक व्यक्तीचे नाव आणि पासपोर्ट नंबर संग्रहित करते. तत्वतः, हे इतके अवघड नाही. उदाहरणार्थ, तुम्ही दोन्ही स्ट्रिंगमध्ये भरू शकता आणि नंतर या स्ट्रिंगची सूची तयार करू शकता: "Amelia Aguilar, 4211 717171". परंतु या सोल्यूशनमध्ये दोन कमतरता आहेत. प्रथम, आम्हाला पासपोर्ट क्रमांकाद्वारे शोधण्याची क्षमता आवश्यक असू शकते. आणि या माहितीच्या स्टोरेज फॉरमॅटमुळे हे समस्याप्रधान असेल. दुसरे, समान पासपोर्ट क्रमांकासह दोन भिन्न लोक तयार करण्यापासून आम्हाला काहीही थांबवत नाही. आणि ही आमच्या समाधानाची सर्वात गंभीर कमतरता आहे. याला कधीही परवानगी दिली जाऊ नये: कोणत्याही दोन लोकांकडे समान पासपोर्ट क्रमांक नाही. एक नवीन डेटा संरचना आमच्या मदतीला येते: नकाशा. याला "सहयोगी अॅरे" म्हणून देखील ओळखले जाते, परंतु हा शब्द क्वचितच वापरला जातो. अधिक सामान्यपणे, त्याला "शब्दकोश" किंवा "नकाशा" म्हणतात. :) आम्ही पूर्वी विचारात घेतलेल्या डेटा स्ट्रक्चर्सपेक्षा ते मूलभूतपणे कसे वेगळे आहे? सर्वात महत्त्वाचे म्हणजे, नकाशामधील डेटा की-व्हॅल्यू जोड्या म्हणून संग्रहित केला जातो. कोणतीही गोष्ट की आणि मूल्ये म्हणून काम करू शकते: संख्या, तार किंवा इतर वर्गांच्या वस्तू. आज आपण नकाशा वर्गाच्या सर्वात सामान्य अंमलबजावणीचा अभ्यास करू : Java HashMap . हॅशमॅप: हा कोणत्या प्रकारचा नकाशा आहे?  - 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);
   }
}
यासाठी आपण put() ही पद्धत वापरतो . याव्यतिरिक्त, हॅशमॅप toString() पद्धत ओव्हरराइड करते , म्हणून ती कन्सोलवर प्रदर्शित केली जाऊ शकते. आउटपुट असे दिसेल: {212133=Bridget Logan, 8082771=Donald John Trump, 162348=Ivan the Great} आता या की खरोखर अद्वितीय आहेत का ते तपासूया? नकाशामध्ये आधीपासून वापरलेल्या कीसह नवीन घटक जोडण्याचा प्रयत्न करूया :

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=Bridget Logan, 8082771=Donald John Trump, 162348=Albert Kent} तुम्ही बघू शकता, की 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);
}
व्हॅल्यू मिळवण्यासाठी किंवा डिक्शनरीमधून जोडी काढून टाकण्यासाठी, आम्हाला get() आणि रिमूव्ह() व्हॅल्यूशी संबंधित असलेली युनिक की पास करणे आवश्यक आहे. अॅरे आणि लिस्टच्या विपरीत, Java मधील हॅशमॅपमध्ये अंकीय निर्देशांक नसतात: की वापरून मूल्यांमध्ये प्रवेश केला जातो. कन्सोल आउटपुट: ब्रिजेट लोगान {212133=ब्रिजेट लोगान, 8082771=डोनाल्ड जॉन ट्रम्प} अॅरेलिस्ट आणि लिंक्डलिस्ट क्लासेसमध्ये सूचीमध्ये काही विशिष्ट घटक आहेत की नाही ते तपासूया. Java HashMap आम्हाला हे करू देते. आणखी काय, आम्ही जोडीच्या दोन्ही सदस्यांसाठी हे करू शकतो: हे समाविष्ट आहे () (की तपासते) आणि त्यात मूल्य () समाविष्ट आहे(मूल्य तपासा) पद्धती यासाठी आहेत.

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"));
}
आउटपुट: असत्य सत्य Java मधील हॅशमॅपचे आणखी एक सोयीस्कर वैशिष्ट्य म्हणजे तुम्हाला सर्व की आणि सर्व व्हॅल्यूजच्या स्वतंत्र याद्या मिळू शकतात. हे keySet() आणि values() पद्धतींनी पूर्ण केले जाते:

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=Bridget Logan, 8082771=Donald John Trump, 162348=Ivan the Great} आता आम्ही फक्त प्राथमिक तपासणीनंतर कन्सोलवर आउटपुट देऊ. :) आणखी एक मनोरंजक मुद्दा म्हणजे दोन नकाशे एकत्र केले जाऊ शकतात. हे 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=Clifford Patrick, 212133=Bridget Logan, 8082771=Donald John Trump, 925648=Mitchell Salgado, 162348=Ivan the Great} पासपोर्ट मधील सर्व जोड्या आणि नावे 2 पासपोर्टच्या नावावर कॉपी केल्या गेल्या आहेत . आता एक अधिक क्लिष्ट उदाहरण विचारात घ्या. विशेषतः, लूपमध्ये हॅशमॅपवर पुनरावृत्ती करणे.

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