2012-08-15 45 views
3

時間字符串列表我有一個字符串列表,每一個都包含時間是這樣的:如何排序的Java或Groovy

「上午3時00」,「12:30」,「 16:15「

我需要按順序對它們進行排序:首先放置」am「次並比較小時,而不僅僅是字符串中的第一個數字。

回答

13

這適用於常規的字符串,你給了所有的情況下:

List dates = [ "16:15", "12:30 PM", "07:00", "03:00 AM" ] 

dates.sort { d -> 
    [ 'h:mm a', 'H:mm' ].findResult { fmt -> 
    try { 
     Date.parse(fmt, d).time 
    } catch(e) {} 
    } 
} 

它基本上與AM/PM嘗試,然後嘗試沒有它,如果失敗

3

所有Java的分揀機械的 - 例如,Collections.sort()方法 - 你自己寫一個類的實例實現java.util.Comparator - 與(或可與合作伙伴)比較工作。該接口有一個compare()方法,您可以將其實現爲進行任何比較。這就是你需要在這裏做的。

2

正如@Ernest所說,你需要使用一個比較器。你可以做這樣的事情與你的清單:

List<String> times; 
Collections.sort(times, new Comparator<String>() { 
    @Override 
    public int compare(String time1, String time2) { 

     // Sorting implementation here 
    } 
}); 
3

使用SimpleDateFormat類,以確定它代表每根弦的時候再排序時比較該數值。它看起來像你和處理可以有各種不同的格式的時間字符串,所以我編輯的答案,支持格式03:00AM16:23

import java.text.DateFormat; 
import java.text.ParseException; 
import java.text.SimpleDateFormat; 
import java.util.*; 

public class TimeStringComparator implements Comparator<String>{ 
    private DateFormat primaryFormat = new SimpleDateFormat("h:mm a"); 
    private DateFormat secondaryFormat = new SimpleDateFormat("H:mm"); 

    @Override 
    public int compare(String time1, String time2){ 
     return timeInMillis(time1) - timeInMillis(time2); 
    } 

    public int timeInMillis(String time){ 
     return timeInMillis(time, primaryFormat); 
    } 

    private int timeInMillis(String time, DateFormat format) { 
     // you may need more advanced logic here when parsing the time if some times have am/pm and others don't. 
     try{ 
      Date date = format.parse(time); 
      return (int)date.getTime(); 
     }catch(ParseException e){ 
      if(format != secondaryFormat){ 
       return timeInMillis(time, secondaryFormat); 
      }else{ 
       throw e; 
      } 
     } 
    } 

    public static void main(String[] args){ 
     List<String> times = Arrays.asList(new String[]{"03:00 AM", "12:30 PM", "16:15"}); 
     Collections.sort(times, new TimeStringComparator()); 
     System.out.println(times); 
    } 

}