2013-12-09 102 views
2

我有一個數組日期的數組:排序基於當前日期

| YYYY-MM-DD || YYYY-MM-DD || YYYY-MM-DD || ... ||。 ... || ....

現在我查詢當前日期的系統和基於此日期,我想我要排序的數組,這一年是無關緊要的月和日是重要的。我想要索引0處的最近日期和最後的最後日期。

說,例如有三個日期1999年4月4日,1789年3月1日,2012-05-04

如果是四月份: 數組排序應該是這樣

1999-04-04,2012-05-04,1789-03-01。

我找的邏輯,不要求做功課。我讀了很多關於這個問題的文章,但我無法設計出一條路。幫助將不勝感激。

+1

執行比較,並使用比較()。你可以添加邏輯來忽略年份,只是檢查月份和日期。 – TheLostMind

+0

好吧,讓我檢查一下。 – User3

+0

你可以用''Days.daysBetween(date1,date2)'' – hbsrud

回答

1

我想要我的數組進行排序,這一年是無關重要的月份和日期 是重要的。我想在索引0最接近的日期和最遠 日最後一次。

您需要進行排序依據的月份和日期第一:雖然比較任意兩個日期ঃ

首先排序的日期列表:

  1. 比較一個月,如果他們不相等的回報作爲比較結果的差值(month1 - month2)
  2. 如果月份相同,則返回當月的當日差異作爲比較結果

因此,一個實施Comparable<Date>compareTo(Date o)功能會是什麼樣子:

@Override 
    public int compareTo(Date o) { 
    Calendar cal1 = Calendar.getInstance(); 
    cal1.setTime(this.date); 
    Calendar cal2 = Calendar.getInstance(); 
    cal2.setTime(o); 

    int month1 = cal1.get(Calendar.MONTH); 
    int month2 = cal2.get(Calendar.MONTH); 

    if(month1 < month2) 
     return -1; 
    else if(month1 == month2) 
     return cal1.get(Calendar.DAY_OF_MONTH) - cal2.get(Calendar.DAY_OF_MONTH); 

    else return 1; 

    } 

排序,你簡直圓的清單後,認爲它是圓形的。例如,假設排序列表(不含一年,因爲它是不相關的):

JAN 20, FEB 5, SEP 18, OCT 9, OCT 20, NOV 23 

如果我們的樞軸(的關閉日期比較的日期)爲OCT 11選擇立即大(最小的日期比pivot大)日期它將是OCT 20。你可以使用for循環找到它。現在,我們只需要一輪吧,讓它覺得是圓形:

OCT 20, NOV 23 --> JAN 20, FEB 5, SEP 18, OCT 9 

形式上,立即找到更大的日期進行比較的我們的支點的基礎月份和日期(嘗試使用的compareTo例子)於指數i,然後創建一個新列表中,插入從索引i開始的元素到n-1,然後0i-1,這裏的n是日期列表的大小。

+0

我喜歡這個邏輯:)我也試過這個! – User3

+0

可以使用'compareTo'方法來實現'Comparator'接口的'compare'方法嗎? (只將當前時間分配給兩個「比較」參數中的一個)。 – DummyBeginner

1

實現一個java.util.Comparator。比較器可以在構造函數中獲取日期並將其作爲參考日期存儲在屬性中。然後compare()方法可以決定哪些傳遞日期的一個更接近基準日(根據你喜歡的任何接近的定義)。

的comperator然後可以與陣列一起傳遞給Array.sort(T[] a, Comparator<? super T> c)

+0

''public int compare(T o1,T o2)''來檢查你的日期,試試這個..如果我發現任何問題.. – User3

+0

@ user2822178,使用比較器顯然實際上不會解決問題。我們不應該每次都根據最近的日期對它進行分類。檢查我的回答 – Sage

+0

@Sage使用比較器顯然實際上*會解決問題。它只是一個實現要求的比較器。檢查*我的*答案!!!! 1 – Oswald

1

你一定要實現一個java.util.Comparator,並傳遞給你的排序方法。其中的代碼實際上應該比較候選人和當前日期之間的絕對天數差異。

1

它實際上是simplier代碼比解釋:

Arrays.sort(array, new Comparator<Date>() 
{ 
    Calendar now = Calendar.getInstance(); 

    @Override 
    public int compare(Date d1, Date d2) 
    { 
     Calendar c1 = Calendar.getInstance(); 
     c1.setTime(d1); 
     c1.set(Calendar.YEAR, now.get(Calendar.YEAR)); // year is irrilevant for d1 

     Calendar c2 = Calendar.getInstance(); 
     c2.setTime(d2); 
     c2.set(Calendar.YEAR, now.get(Calendar.YEAR)); // year is irrilevant for d2 

     Long distance1 = Long.MAX_VALUE; 
     Long distance2 = Long.MAX_VALUE; 

     for(int i : new Integer[] { -1, 0, 1 }) 
     { 
      c1.set(Calendar.YEAR, now.get(Calendar.YEAR) + i); 
      c2.set(Calendar.YEAR, now.get(Calendar.YEAR) + i); 

      Long temp1 = Math.abs(c1.getTimeInMillis() - now.getTimeInMillis()); 
      Long temp2 = Math.abs(c2.getTimeInMillis() - now.getTimeInMillis()); 

      distance1 = Math.min(distance1, temp1); 
      distance2 = Math.min(distance2, temp2); 
     } 

     return distance1.compareTo(distance2); 
    } 
}); 
+0

謝謝你,我遵循邏輯:) – User3

+1

編輯到帳戶輪比較 –