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 กับคีย์ที่ดูใกล้กัน