我有一个字符串列表,每个字符串都包含这样的时间:
" 03:00 AM"," 12:30 PM"," 16:15"
我需要按顺序排序:put" am"首先是时间并比较小时数,而不仅仅是字符串中的第一个数字。
答案 0 :(得分:13)
这适用于groovy,包括你提供的所有案例:
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,然后在没有它的情况下尝试(如果失败)
答案 1 :(得分:3)
所有Java的排序机制 - 例如Collections.sort()
方法 - 与比较器一起工作(或可以使用) - 你自己编写的类的实例实现java.util.Comparator
。该接口具有compare()
方法,您可以将其实现为进行任何所需的比较。这就是你需要做的事情。
答案 2 :(得分:3)
使用SimpleDateFormat类来确定表示每个字符串的时间,然后在排序时比较该数值。看起来你正在处理的时间字符串可以有不同的格式,所以我编辑了答案以支持格式为03:00AM
或16: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);
}
}
答案 3 :(得分:2)
正如@Ernest所说,你需要使用比较器。您可以使用列表执行以下操作:
List<String> times;
Collections.sort(times, new Comparator<String>() {
@Override
public int compare(String time1, String time2) {
// Sorting implementation here
}
});