2017-04-26 98 views
0

日期我使用這種算法來排序的日期在升序排列:排序JodaTime名單由collections.sort

Collections.sort(eventList, new Comparator<Event>() { 
     @Override 
     public int compare(Event e1, Event e2) { 
      DateTime dt1 = new DateTime(e1.getStartDate()); 
      DateTime dt2 = new DateTime(e2.getStartDate()); 
      return dt1.isBefore(dt2)? 1:0; 
     } 
    }); 
    Event first = eventList.get(0); 

我的問題是,這是做事的最好的和正確的方式?

這是第二個建議:

Collections.sort(eventList, new Comparator<Event>() { 
     @Override 
     public int compare(Event e1, Event e2) { 
      DateTime dt1 = new DateTime(e1.getStartDate()); 
      DateTime dt2 = new DateTime(e2.getStartDate()); 
      if(dt1.isBefore(dt2)) 
       return -1; 
      else if(dt1.isAfter(dt2)) 
       return 1; 
      else return 0; 
     } 
    }); 
    Event first = eventList.get(0); 
+0

根據https://docs.oracle.com/javase/7/docs/api/java/util/Comparator.html#compare(T,%20T),「compare」應該返回「一個負整數,零,或者作爲第一個參數的正整數小於,等於或大於第二個參數。「所以你的return語句看起來不正確,因爲它沒有考慮'dt1'之前發生的'dt2'。 –

回答

1

有2種選擇。

使用ComparatorDateTime每個Event比較:

Collections.sort(eventList, new Comparator<Event>() { 
    @Override 
    public int compare(Event event1, Event event2) { 
     DateTime d1 = new DateTime(event1.getStartDate()); 
     DateTime d2 = new DateTime(event2.getStartDate()); 
     return d1.compareTo(d2); 
    } 
}); 

其實,如果getStartDate()返回java.util.Date,你並不需要創建一個DateTime因爲java.util.Date也實現Comparable。在這種情況下,你可能只是做:

Collections.sort(eventList, new Comparator<Event>() { 
    @Override 
    public int compare(Event event1, Event event2) { 
     return event1.getStartDate().compareTo(event2.getStartDate()); 
    } 
}); 

2-使Event工具Comparable

public class Event implements Comparable<Event> { 

    @Override 
    public int compareTo(Event other) { 
     DateTime dt1 = new DateTime(this.getStartDate()); 
     DateTime dt2 = new DateTime(other.getStartDate()); 
     return dt1.compareTo(dt2); 
    } 
} 

Collections.sort(eventList); 

在這種情況下,Collections.sort將使用Event.compareTo方法進行排序。

再次,如果getStartDate()返回java.util.Date,你只需要做:

public class Event implements Comparable<Event> { 

    @Override 
    public int compareTo(Event other) { 
     return this.getStartDate().compareTo(other.getStartDate()); 
    } 
} 

選擇哪一個?這取決於。

如果您使用替代2(實施Comparable),這意味着在比較起始日期是Event對象(「正常」 /「通常」事件排序的方式)的「自然秩序」。

使用Comparator(在我看來)是一種替代方法,當你想使用不同的標準(除了「自然順序」)進行排序。

但這取決於你選擇。

1

由於DateTime已經實現了Comparable接口,你可以這樣做:

Collections.sort(eventList, new Comparator<Event>() { 
    @Override 
    public int compare(Event e1, Event e2) { 
     DateTime dt1 = new DateTime(e1.getStartDate()); 
     DateTime dt2 = new DateTime(e2.getStartDate()); 
     return dt1.compareTo(dt2); 
    } 
});