在 Java 開發中,當我們需要對集合或陣列中的自訂物件進行排序時,實作 Comparator 介面是最靈活的方式。本文將透過一個快遞物流追蹤的實際場景,完整示範如何實作比較器、處理日期排序,以及在單元測試中驗證排序結果。
首先定義代表快遞處理節點的實體類別,包含處理時間與地點兩個核心屬性:
package com.ljq.entity;
public class Step {
private String acceptTime = "";
private String acceptAddress = "";
public Step() {}
public Step(String acceptTime, String acceptAddress) {
this.acceptTime = acceptTime;
this.acceptAddress = acceptAddress;
}
// Getter/Setter 方法省略...
}
建立專門的比較器類別,將字串時間轉換為 Date 物件後比較,支援升序與降序切換:
package com.ljq.entity;
import java.util.Comparator;
import java.util.Date;
import com.ljq.util.UtilTool;
public class StepComparator implements Comparator<Step> {
@Override
public int compare(Step o1, Step o2) {
Date acceptTime1 = UtilTool.strToDate(o1.getAcceptTime(), null);
Date acceptTime2 = UtilTool.strToDate(o2.getAcceptTime(), null);
// 升序:較早的時間排在前面
if (acceptTime1.after(acceptTime2)) return 1;
return -1;
// 若需降序,可改用 before 方法
// if (acceptTime1.before(acceptTime2)) return 1;
// return -1;
}
}
使用 JUnit 與 Collections.sort 進行實際測試:
package junit;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.junit.Test;
import com.ljq.entity.Step;
import com.ljq.entity.StepComparator;
public class StepComparatorTest {
@Test
public void sort() throws Exception {
List<Step> steps = new ArrayList<>();
// 此處應添加測試資料...
StepComparator comparator = new StepComparator();
Collections.sort(steps, comparator);
if (steps != null && steps.size() > 0) {
for (Step step : steps) {
System.out.println("地點:" + step.getAcceptAddress());
System.out.println("時間:" + step.getAcceptTime());
}
}
}
}
Comparator<T> 並覆寫 compare 方法Date 或 LocalDateTime 再比較,避免字串比較錯誤Collections.sort 為穩定排序,相同元素相對位置不變UtilTool.strToDate,實際專案建議使用 DateTimeFormatter (Java 8+)掌握 Comparator 介面,即可靈活處理各種複雜排序需求,是 Java 開發者必備的核心技能之一。