【Java】TreeMap 使用案例

一個典型的使用 TreeMap 的需求場景是 處理時間戳數據,例如需要按時間順序存儲和查詢事件記錄或日誌數據。

需求場景:按時間順序存儲並查詢數據

假設你在開發一個日誌系統,記錄應用程序的操作時間和相關事件。這些事件是根據發生的時間進行排序的。你可能會有以下需求:

  1. 按時間順序存儲事件:確保每次插入的新事件自動按時間戳排序。
  2. 按時間範圍查詢事件:例如,查詢某個特定時間段內發生的所有事件。

在這種情況下,TreeMap 可以幫助你按時間戳自動排序並且支持範圍查詢。

具體實現:

import java.util.Map; import java.util.NavigableMap; import java.util.TreeMap; public class LogSystem { // TreeMap 的鍵是時間戳(Long 型別),值是事件描述 private TreeMap<Long, String> logMap; public LogSystem() { logMap = new TreeMap<>(); } // 添加事件,根據時間戳存儲事件 public void addLog(long timestamp, String event) { logMap.put(timestamp, event); } // 根據時間範圍查詢事件 public void getLogsInRange(long startTime, long endTime) { // subMap 方法返回一個範圍內的子 Map,startTime 和 endTime 之間的事件 NavigableMap<Long, String> rangeLogs = logMap.subMap(startTime, true, endTime, true); for (Map.Entry<Long, String> entry : rangeLogs.entrySet()) { System.out.println("Time: " + entry.getKey() + " Event: " + entry.getValue()); } } public static void main(String[] args) { LogSystem logSystem = new LogSystem(); // 添加一些事件 logSystem.addLog(1630310400000L, "Server started"); logSystem.addLog(1630314000000L, "User login"); logSystem.addLog(1630317600000L, "User logout"); logSystem.addLog(1630321200000L, "Server shutdown"); // 查詢某個時間範圍內的事件 System.out.println("Logs between 1630314000000 and 1630321200000:"); logSystem.getLogsInRange(1630314000000L, 1630321200000L); } }

說明:

  1. 存儲事件logMap.put(timestamp, event) 將事件存儲在 TreeMap 中,並自動按時間戳(鍵)排序。
  2. 按時間範圍查詢:通過 subMap 方法,根據開始時間 startTime 和結束時間 endTime 查詢該範圍內的事件,結果會按鍵排序。

為什麼用 TreeMap

  • 自動排序:每個新插入的事件按時間戳自動排序,不需要手動進行排序處理。
  • 範圍查詢TreeMap 提供了 subMapheadMaptailMap 等方法,能夠高效地查詢指定範圍內的數據。

這種場景中的時間戳排序和範圍查詢功能是 TreeMap 的強項,適合處理需要保持順序性並進行範圍查詢的需求。

本文由 ChatGPT 生成