2017-04-03 157 views
0

基本上我有有一個名字且StartDate對象的ArrayList打印名單,他們是在一個類似的初始目的是:無法弄清楚如何在這個正確的順序

弗蘭克一九九零年十月二十○日

比爾1990年1月2日

弗蘭克·1990年2月2日

約翰·1990年9月8日

比爾1990年4月4日

弗蘭克·1990年5月1日

我試圖把它們打印在聲明的第一個名字的順序,然後按日期,例如,最終印刷應打印:

弗蘭克·1990年1月1日

弗蘭克·1990年5月1日

弗蘭克一九九零年十月二十零日

比爾1990年1月2日

比爾·1990年4月4日

約翰·1990年9月8日

+0

*「我試圖按照聲明的名字和按日期的順序將它們打印出來」* - 到目前爲止您嘗試了什麼? – MadProgrammer

+0

你有兩個基本問題,都是以前解決過的。首先是,如何排序表示日期的'String',以及如何根據多於一個屬性對對象進行排序 – MadProgrammer

+0

我已經爲您的問題添加了兩種不同的解決方案來回答我的問題,因爲我不確定您正是想要的。也許你可以澄清這一點。 – JDC

回答

1

假設你對象類看起來是這樣的:

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年

0

你應該做的兩個步驟:

Collections.sort(myList, new Comparator<MyObject>() { 
     public int compare(MyObject o1, MyObject o2) { 
      return o1.getName().compareTo(o2.getName()); 
     } 
    }); 

和存儲:按名稱使用自定義比較喜歡

一階

:在一個臨時列表輸出

二使用臨時列表中的數據進行排序

然後您的列表將按您的要求排序。

+0

這不是按字母順序排列嗎?我無法弄清楚如何使用首先聲明的名字打印所有對象,而不是按字母順序排列 –