有序整數集合 `Set
Set set = new HashSet<>(Arrays.asList(8,3,4,7,6,5));
// 遍歷 O(N),無序,效率低
NavigableSet set = new TreeSet<>(Arrays.asList(8,3,4,7,6,5));
// 或 TreeSet set = new TreeSet<>(...);
Integer ceiling = set.ceiling(2); // 3
Integer higher = set.higher(8); // null (嚴格大於)
Integer floor = set.floor(6); // 6
Integer lower = set.lower(3); // null
| 方法 | 語義 | 示例 (集合 3,4,5,6,7,8) |
|---|---|---|
| `ceiling(e)` | ≥ e 的最小元素 | `ceiling(2)=3`, `ceiling(5)=5` |
| `higher(e)` | > e 的最小元素 | `higher(5)=6`, `higher(8)=null` |
| `floor(e)` | ≤ e 的最大元素 | `floor(6)=6`, `floor(9)=8` |
| `lower(e)` | < e 的最大元素 | `lower(3)=null`, `lower(5)=4` |
import java.util.*;
public class CeilingDemo {
public static void main(String[] args) {
NavigableSet set = new TreeSet<>(Arrays.asList(8,3,4,7,6,5));
int[] queries = {2, 5, 8, 9};
for (int q : queries) {
Integer c = set.ceiling(q);
System.out.printf("輸入 %d → ceiling: %s%n", q, c);
}
}
}
// 輸出:
// 輸入 2 → ceiling: 3
// 輸入 5 → ceiling: 5
// 輸入 8 → ceiling: 8
// 輸入 9 → ceiling: null
**結論:有序集合查找「最近大於/等於」請直接用 `TreeSet.ceiling()` / `higher()`,拒絕手寫遍歷/二分。**