นากกายต้นฉบับกำลังเลื่อนไม้ชี้ระหว่างหมุดก่อนหน้าและหมุดถัดไปบนเส้นเวลา

Java NavigableMap: หาเพดานและพื้นของช่วงเวลาโดยไม่วนทั้งตาราง

พี่โชว์Engineering

ตารางราคาแบบมีผลตามเวลา หรือ configuration ที่เปลี่ยนตาม version มักถามว่า “ค่าล่าสุดที่ไม่เกินจุดนี้คืออะไร” ครับ NavigableMap.floorEntry ตอบค่าพื้น ส่วน ceilingEntry ตอบค่าเพดานโดยไม่ต้องวนทุก entry

import java.util.Map;
import java.util.NavigableMap;
import java.util.TreeMap;

public class Main {
    public static void main(String[] args) {
        NavigableMap<Integer, String> plans = new TreeMap<>();
        plans.put(10, "small");
        plans.put(50, "medium");
        plans.put(100, "large");

        Map.Entry<Integer, String> floor = plans.floorEntry(72);
        Map.Entry<Integer, String> ceiling = plans.ceilingEntry(72);
        assert floor.getKey() == 50 && floor.getValue().equals("medium");
        assert ceiling.getKey() == 100;
        assert plans.floorEntry(5) == null;
        System.out.println("NavigableMap tests passed");
    }
}

TreeMap ให้เวลา O(log n) ต่อ lookup และเรียงตาม comparator หาก comparator ถือคีย์สองตัวว่าเท่ากัน ค่าใหม่จะทับค่าเดิมแม้ equals() ต่าง จึงต้องออกแบบ comparator ให้สอดคล้องกับ identity และจัดการ null เมื่อไม่มี floor/ceiling อย่างชัดเจน

Recap

  • ใช้ floorEntry กับค่าล่าสุดที่ไม่เกิน boundary
  • ใช้ ceilingEntry กับค่าถัดไปที่ไม่น้อยกว่า boundary
  • ตรวจ null ที่ปลายช่วง
  • ทดสอบ comparator กับคีย์ที่ดูใกล้กัน