假設你對象類看起來是這樣的:
private static class MyObject {
private final String name;
private final Date date;
private MyObject(String name, Date date) {
this.name = name;
this.date = date;
}
public String getName() {
return name;
}
public Date getDate() {
return date;
}
}
你可以通過下面的方法打印對象:
@Test
public void printInOrder() {
List<MyObject> list = new ArrayList<>(); // List containing your objects
list.add(new MyObject("Frank", Date.from(LocalDate.of(1990, 10, 20).atStartOfDay(ZoneId.systemDefault()).toInstant())));
list.add(new MyObject("Bill", Date.from(LocalDate.of(1990, 1, 2).atStartOfDay(ZoneId.systemDefault()).toInstant())));
list.add(new MyObject("Frank", Date.from(LocalDate.of(1990, 2, 2).atStartOfDay(ZoneId.systemDefault()).toInstant())));
list.add(new MyObject("John", Date.from(LocalDate.of(1990, 9, 8).atStartOfDay(ZoneId.systemDefault()).toInstant())));
list.add(new MyObject("Bill", Date.from(LocalDate.of(1990, 4, 4).atStartOfDay(ZoneId.systemDefault()).toInstant())));
list.add(new MyObject("Frank", Date.from(LocalDate.of(1990, 5, 1).atStartOfDay(ZoneId.systemDefault()).toInstant())));
list.stream()
.sorted(Comparator.comparing(MyObject::getName)
.thenComparing(Comparator.comparing(MyObject::getDate)))
.map(obj -> obj.getName() + " " + obj.getDate())
.forEach(System.out::println);
}
輸出:
比爾星期二00年1月2日: 00:00 CET 1990
Bill Wed Apr 04 00:00:00 CEST 1990
弗蘭克週五年2月2日00:00:00 CET 1990年
弗蘭克週二05月01日00:00:00 CEST 1990年
弗蘭克週六10月20日00:00:00 CET 1990年
約翰週六九月08 00:00:00 CEST 1990年
這使用Java 8流和比較鏈到你的對象進行排序。比較器通過給定的屬性進行比較,thenComparing
用於鏈接它們。
UPDATE:
由於我不知道如果我可能誤解了你,這裏是以下情況下的第二個版本:
你想以按名稱排序,但在訂單名稱出現在原始列表中,因此名稱首先出現在第一位。
在這種情況下,您必須記住單獨的臨時列表中的名稱順序(只包含原始順序中的唯一名稱),以後可以在比較器中使用它們。
此列表是通過將原始列表轉換爲集合(因此只有唯一名稱)並將該集合轉換回列表(以便能夠在比較器中使用indexOf
)生成的。
@Test
public void printInOrder() {
List<MyObject> list = new ArrayList<>();
list.add(new MyObject("Frank", Date.from(LocalDate.of(1990, 10, 20).atStartOfDay(ZoneId.systemDefault()).toInstant())));
list.add(new MyObject("Bill", Date.from(LocalDate.of(1990, 1, 2).atStartOfDay(ZoneId.systemDefault()).toInstant())));
list.add(new MyObject("Frank", Date.from(LocalDate.of(1990, 2, 2).atStartOfDay(ZoneId.systemDefault()).toInstant())));
list.add(new MyObject("John", Date.from(LocalDate.of(1990, 9, 8).atStartOfDay(ZoneId.systemDefault()).toInstant())));
list.add(new MyObject("Bill", Date.from(LocalDate.of(1990, 4, 4).atStartOfDay(ZoneId.systemDefault()).toInstant())));
list.add(new MyObject("Frank", Date.from(LocalDate.of(1990, 5, 1).atStartOfDay(ZoneId.systemDefault()).toInstant())));
List<String> declaredNameOrder = new ArrayList<>(list.stream()
.map(MyObject::getName)
.collect(Collectors.toCollection(LinkedHashSet::new)));
list.stream()
.sorted(Comparator.<MyObject>comparingInt(o -> declaredNameOrder.indexOf(o.getName()))
.thenComparing(Comparator.comparing(MyObject::getDate)))
.map(obj -> obj.getName() + " " + obj.getDate())
.forEach(System.out::println);
}
輸出:
弗蘭克週五年2月2日00:00:00 CET 1990年
弗蘭克週二05月01日00:00:00 CEST 1990年
弗蘭克週六10月20日00:00:00 CET 1990年
比爾星期二1月2日00:00:00 CET 1990年
比爾週三4月4日00:00:00 CEST 1990年
約翰週六九月08 00:00:00 CEST 1990年
*「我試圖按照聲明的名字和按日期的順序將它們打印出來」* - 到目前爲止您嘗試了什麼? – MadProgrammer
你有兩個基本問題,都是以前解決過的。首先是,如何排序表示日期的'String',以及如何根據多於一個屬性對對象進行排序 – MadProgrammer
我已經爲您的問題添加了兩種不同的解決方案來回答我的問題,因爲我不確定您正是想要的。也許你可以澄清這一點。 – JDC