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

ใช้ TreeMap เรียง User-defined Objects ใน Java

TreeMap: Sorted Map (Red-Black Tree)

เก็บ key-value เรียงตาม key อัตโนมัติ (natural ordering หรือ Comparator) O(log n) สำหรับ put/get

โจทย์: เรียง User Objects ตามอายุ (Integer)


import java.util.*;

class Person {
    String name;
    int age;
    Person(String name, int age) { this.name = name; this.age = age; }
    @Override public String toString() { return name + "(" + age + ")"; }
}

public class Demo {
    public static void main(String[] args) {
        // ข้อมูล: name age name age ...
        String data = "Joe 36 Hannah 24 Jill 13 Jack 1 Preet 8 Deep 45";
        
        // Parse และ group by age ใน TreeMap (เรียงตามอายุอัตโนมัติ)
        TreeMap> map = new TreeMap<>();
        
        String[] parts = data.split(" ");
        for (int i = 0; i < parts.length; i += 2) {
            String name = parts[i];
            int age = Integer.parseInt(parts[i + 1]);
            
            map.computeIfAbsent(age, k -> new ArrayList<>()).add(name);
        }
        
        // เรียงชื่อในแต่ละอายุ (optional)
        map.forEach((age, names) -> Collections.sort(names));
        
        // แสดงผล
        map.forEach((age, names) -> 
            names.forEach(name -> System.out.println(name + " " + age))
        );
    }
}

ผลลัพธ์

Jack 1
Preet 8
Jill 13
Hannah 24
Joe 36
Deep 45

จุดสำคัญ

  • TreeMap เรียง key อัตโนมัติ (Integer มี natural ordering)
  • computeIfAbsent (Java 8) สร้าง List ใหม่ถ้ายังไม่มี key นั้น
  • เก็บ List เป็น value เพื่อรองรับหลายคนอายุเท่ากัน
  • Complexity: O(n log n) สำหรับ n คน

เปรียบเทียบ Map Implementations

Custom Object เป็น Key

Implement Comparable<T> หรือส่ง Comparator ให้ TreeMap constructor

MapOrderNull KeyTime (get/put)
HashMapไม่มีได้ 1 ตัวO(1)
LinkedHashMapInsertion/Accessได้ 1 ตัวO(1)
TreeMapSorted (Key)ไม่ได้ (throw NPE)O(log n)
Hashtableไม่มีไม่ได้O(1) synchronized