Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

Java Program อัปเดตค่าใน HashMap โดยใช้ Key

การอัปเดตค่าใน HashMap

HashMap<K, V> ใช้ put(key, value) สำหรับทั้ง เพิ่มใหม่ และ อัปเดตค่าที่มีอยู่ - หาก Key มีอยู่แล้ว จะแทนที่ค่าเก่า

ขั้นตอนการอัปเดต

  1. ดึงค่าเก่าด้วย get(key)
  2. คำนวณ/เปลี่ยนแปลงค่า
  3. put กลับด้วย Key เดียวกัน

ตัวอย่างที่ 1: ใน main โดยตรง

import java.util.HashMap;

public class Demo {
    public static void main(String[] args) {
        System.out.println("The required packages have been imported");
        
        HashMap inputMap = new HashMap<>();
        inputMap.put("Java", 1);
        inputMap.put("Scala", 2);
        inputMap.put("Python", 3);
        
        System.out.println("The HashMap is defined as: " + inputMap);
        
        // 1. ดึงค่าเก่า
        int value = inputMap.get("Scala");
        
        // 2. คำนวณค่าใหม่ (บวก 10)
        value = value + 10;
        
        // 3. Put กลับ (อัปเดต)
        inputMap.put("Scala", value);
        
        System.out.println("\nThe HashMap with the updated value is: " + inputMap);
    }
}

ผลลัพธ์

The required packages have been imported
The HashMap is defined as: {Java=1, Scala=2, Python=3}
The HashMap with the updated value is: {Java=1, Scala=12, Python=3}

ตัวอย่างที่ 2: แยกเป็นเมธอด (OOP)

import java.util.HashMap;

class Demo {
    
    static void update(HashMap inputMap, String updateKey) {
        int value = inputMap.get(updateKey);
        value = value + 10;
        inputMap.put(updateKey, value);
        System.out.println("\nThe HashMap with the updated value is: " + inputMap);
    }
    
    public static void main(String[] args) {
        System.out.println("The required packages have been imported");
        
        HashMap inputMap = new HashMap<>();
        inputMap.put("Java", 1);
        inputMap.put("Scala", 2);
        inputMap.put("Python", 3);
        
        System.out.println("The HashMap is defined as: " + inputMap);
        
        String updateString = "Scala";
        update(inputMap, updateString);
    }
}

เมธอดสำหรับอัปเดตที่ทันสมัยกว่า (Java 8+)

1. compute() - คำนวณจากค่าเก่า

// อัปเดตโดยใช้ค่าเก่า
map.compute("Scala", (k, v) -> v == null ? 10 : v + 10);

// ถ้า Key ไม่มีอยู่ จะสร้างใหม่ด้วยค่าที่คำนวณได้

2. computeIfPresent() - อัปเดตเฉพาะ Key ที่มีอยู่

// อัปเดตเฉพาะถ้ามี Key นี้อยู่แล้ว
map.computeIfPresent("Scala", (k, v) -> v + 10);
// ถ้าไม่มี Key "Scala" จะไม่ทำอะไร (ไม่สร้างใหม่)

3. merge() - รวมค่าเก่าและค่าใหม่

// ใช้เมื่อต้องการ merge ค่า (เช่น นับความถี่)
map.merge("Scala", 10, (oldVal, newVal) -> oldVal + newVal);
// เทียบเท่า: put(key, oldVal + newVal) ถ้ามี key, put(key, newVal) ถ้าไม่มี

4. replace() - แทนที่ค่า (เฉพาะ Key ที่มีอยู่)

// แทนที่ค่าเก่าด้วยค่าใหม่ (ต้องมี Key อยู่แล้ว)
map.replace("Scala", 12); // คืน true ถ้าสำเร็จ

// แทนที่ก็ต่อเมื่อค่าเก่าเท่ากับที่ระบุ
map.replace("Scala", 2, 12); // คืน true ถ้าค่าเก่าเป็น 2

การจัดการ Key ที่ไม่มีอยู่

// ปัญหา: get() คืน null → NullPointerException ตอนคำนวณ
int value = map.get("NonExistent"); // null
value = value + 10; // NPE!

// แก้: ใช้ getOrDefault()
int value = map.getOrDefault("Scala", 0) + 10;
map.put("Scala", value);

// หรือ Java 8+ compute()
map.compute("Scala", (k, v) -> (v == null ? 0 : v) + 10);

Thread Safety (ConcurrentHashMap)

ใน Multi-threaded Environment ใช้ ConcurrentHashMap:

ConcurrentHashMap map = new ConcurrentHashMap<>();
map.put("Scala", 2);

// Atomic update
map.compute("Scala", (k, v) -> v == null ? 10 : v + 10);

// หรือใช้ LongAdder สำหรับ Counter
ConcurrentHashMap counters = new ConcurrentHashMap<>();
counters.computeIfAbsent("Scala", k -> new LongAdder()).increment();

สรุป

  • put(key, newValue) ใช้สำหรับทั้ง Insert และ Update
  • Pattern แบบคลาสสิก: get → compute → put
  • Java 8+: ใช้ compute(), computeIfPresent(), merge(), replace()
  • ระวัง NullPointerException ใช้ getOrDefault() หรือ compute()
  • Multi-thread: ใช้ ConcurrentHashMap + atomic methods