CodeGym /จาวาบล็อก /สุ่ม /HashMap: นี่คือแผนที่ประเภทใด
John Squirrels
ระดับ
San Francisco

HashMap: นี่คือแผนที่ประเภทใด

เผยแพร่ในกลุ่ม
สวัสดี! ในบทเรียนนี้ เราจะตรวจสอบอย่างละเอียดยิ่งขึ้นเกี่ยวกับJava HashMap ก่อนหน้านี้ เราได้ศึกษาโครงสร้างข้อมูลที่เก็บองค์ประกอบต่างๆ ในอาร์เรย์หรือArrayList / LinkedListเราเก็บองค์ประกอบไว้จำนวนหนึ่ง แต่ถ้างานของเราเปลี่ยนไปเล็กน้อยล่ะ?
HashMap: นี่คือแผนที่ประเภทใด  - 1
ลองนึกภาพงานต่อไปนี้: สร้างรายชื่อ 100 คนที่เก็บชื่อและหมายเลขหนังสือเดินทางของแต่ละคน โดยหลักการแล้วมันไม่ใช่เรื่องยาก ตัวอย่างเช่น คุณสามารถใส่ทั้งสองอย่างลงในสตริง แล้วสร้างรายการของสตริงเหล่านี้: "Amelia Aguilar, 4211 717171" แต่วิธีนี้มีข้อเสียสองประการ ขั้นแรก เราอาจต้องการความสามารถในการค้นหาตามหมายเลขหนังสือเดินทาง และนี่จะเป็นปัญหาเนื่องจากรูปแบบการจัดเก็บข้อมูลนี้ ประการที่สอง ไม่มีอะไรหยุดเราไม่ให้สร้างคนสองคนที่มีหมายเลขหนังสือเดินทางเดียวกัน และนี่คือข้อบกพร่องที่ร้ายแรงที่สุดของโซลูชันของเรา สิ่งนี้ไม่ควรได้รับอนุญาต: ห้ามคนสองคนมีหมายเลขหนังสือเดินทางเดียวกัน โครงสร้างข้อมูลใหม่มาช่วยเรา: แผนที่. เรียกอีกอย่างว่า "อาร์เรย์ที่เชื่อมโยง" แต่คำนี้ใช้ไม่บ่อยนัก โดยทั่วไปจะเรียกว่า "พจนานุกรม" หรือ "แผนที่" :) โดยพื้นฐานแล้วแตกต่างจากโครงสร้างข้อมูลที่เราเคยพิจารณาก่อนหน้านี้อย่างไร เหนือสิ่งอื่นใด ความจริงที่ว่าข้อมูลในแผนที่จะถูกจัดเก็บเป็นคู่คีย์-ค่า สิ่งใดก็ตามที่สามารถใช้เป็นคีย์และค่าได้: ตัวเลข สตริง หรือวัตถุของคลาสอื่นๆ วันนี้เราจะศึกษาการใช้งาน Map class ที่ใช้บ่อยที่สุด: Java HashMap HashMap: นี่คือแผนที่ประเภทใด  - 2

แล้วเราต้องรู้อะไรบ้างเกี่ยวกับ HashMap ใน Java

มันง่ายมากที่จะสร้าง:

public static void main(String[] args) {
   HashMap<Integer, String> passportsAndNames = new HashMap<>();
}
ที่นี่เราสร้างพจนานุกรมที่เก็บองค์ประกอบเป็นคู่ "ตัวเลข-สตริง" ตัวเลขจะทำหน้าที่เป็นคีย์และสตริงเป็นค่า นอกจากนี้ เรายังระบุประเภทคีย์ (จำนวนเต็ม) และประเภทค่า (สตริง) ทำไม ประการแรก คีย์ HashMapจะไม่ซ้ำกันเสมอ ซึ่งเหมาะกับเราอย่างยิ่ง เนื่องจากเราสามารถใช้หมายเลขหนังสือเดินทางเป็นกุญแจและหลีกเลี่ยงการใช้ซ้ำได้ ค่าจะเป็นสตริงที่มีชื่อเต็ม (คนอื่นสามารถมีชื่อเดียวกันได้ ไม่มีอะไรต้องกังวล) การเพิ่มคู่ใหม่ใน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);
   }
}
เราใช้วิธีการใส่ ()สำหรับสิ่งนี้ นอกจากนี้HashMapจะแทนที่เมธอด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ถูกเขียนทับ เราใช้คำว่า "คีย์" ด้วยเหตุผล ค่าในHashMapเข้าถึงได้โดยใช้คีย์ แต่ไม่ใช่วิธีอื่น ไม่สามารถรับคีย์โดยใช้ค่าได้ เนื่องจากค่าอาจไม่ซ้ำกัน สิ่งนี้สามารถเห็นได้อย่างชัดเจนเมื่อรับหรือลบองค์ประกอบออกจาก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");

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

   passportsAndNames.remove(162348);
   System.out.println(passportsAndNames);
}
ในการรับค่าหรือลบคู่ออกจากพจนานุกรม เราต้องส่งคีย์เฉพาะที่สอดคล้องกับค่านั้นไป ที่ get()และremove() ซึ่งแตกต่างจากอาร์เรย์และรายการHashMapใน Java ไม่มีดัชนีตัวเลข: เข้าถึงค่าได้โดยใช้คีย์ เอาต์พุตของคอนโซล: Bridget Logan {212133=Bridget Logan, 8082771=Donald John Trump} คลาสArrayListและLinkedListช่วยให้เราตรวจสอบว่ารายการมีองค์ประกอบใดเป็นพิเศษหรือไม่ Java HashMapช่วยให้เราทำสิ่งนี้ได้ ยิ่งไปกว่านั้น เราสามารถทำได้สำหรับสมาชิกทั้งสองของทั้งคู่: นี่คือสิ่งที่ containerKey () (ตรวจสอบหาคีย์) และcontainerValue()(ตรวจสอบค่า) วิธีการสำหรับ

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"));
}
เอาต์พุต: เท็จ จริง คุณลักษณะที่สะดวกอีกประการหนึ่งของHashMap ใน Javaคือข้อเท็จจริงที่ว่าคุณสามารถรับรายการคีย์ทั้งหมดและค่าทั้งหมดแยกกันได้ สิ่งนี้สำเร็จได้ด้วย เมธอด 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);
   }
}
คีย์ถูกแยกออกเป็นSetซึ่งเรายังไม่ได้กล่าวถึง มีความพิเศษตรงที่ไม่สามารถมีองค์ประกอบที่ซ้ำกันได้ ตอนนี้สิ่งสำคัญคือต้องจำไว้ว่าสามารถดึงรายการคีย์ทั้งหมดจาก HashMap ไปยังคอลเล็กชันแยกต่างหากได้ ในตัวอย่าง เราบันทึกค่าลงในArrayListธรรมดา เอาต์พุตคอนโซล: คีย์: [212133, 8082771, 162348] ค่า: [Bridget Logan, Donald John Trump, Ivan the Great] เมธอด size ()และclear()ทำสิ่งเดียวกันกับในโครงสร้างก่อนหน้านี้ที่เราพูดถึง: รายการแรกส่งคืนจำนวนองค์ประกอบที่อยู่ในพจนานุกรม รายการที่สองจะลบองค์ประกอบทั้งหมด

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 {} หากต้องการตรวจสอบว่ามีองค์ประกอบอย่างน้อยหนึ่งรายการในHashMap ของเรา หรือไม่ เราสามารถใช้ เมธอด 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() เราเรียกมันในHashMap ตัวแรก ส่งผ่านตัวที่สองเป็นอาร์กิวเมนต์ และองค์ประกอบจากตัวที่สองจะถูกเพิ่มเข้าไปในตัวแรก:

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} คู่ทั้งหมดในpassportsAndNames2ถูกคัดลอกไปยังpassportsAndNames พิจารณาตัวอย่างที่ซับซ้อนมากขึ้น โดยเฉพาะอย่างยิ่ง การวนซ้ำบนHashMapในลูป

for (Map.Entry<Integer, String> entry: passportsAndNames.entrySet()) {
   System.out.println(entry);
}
คลาสMap.Entryหมายถึงคู่คีย์-ค่าภายในพจนานุกรม เมธอด entrySet ()ส่งคืนรายการของคู่ทั้งหมดในHashMapของ เรา เนื่องจากแผนที่ของเราประกอบด้วยคู่ของMap.Entryเราจึงทำซ้ำคู่ ไม่ใช่แยกคีย์หรือค่า ผลลัพธ์: 212133=Bridget Logan 8082771= Donald John Trump 162348=Ivan the Great นอกจากนี้ อย่าลืมศึกษาเอกสารอย่างเป็นทางการของ OracleสำหรับHashMap
ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION