文字列のリストがあり、それぞれに次のような時間が含まれています。
「午前03:00」、「午後12:30」、「16:15」
それらを順番に並べ替える必要があります。文字列の最初の数字だけでなく、「am」時間を最初に置き、時間を比較します。
これは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で試行し、失敗した場合はAM/PMなしで試行します
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);
}
}
Javaのすべてのソート機構(たとえば、メソッド)は、コンパレーター(を実装する自分で作成したクラスのインスタンスCollections.sort()
)と連携します(または連携できます) 。そのインターフェースにはメソッドがあり、それを実装して任意の種類の比較を行うことができます。それがあなたがここでする必要があることです。java.util.Comparator
compare()
@Ernestが言ったように、コンパレータを使用する必要があります。あなたはあなたのリストでこのようなことをすることができます:
List<String> times;
Collections.sort(times, new Comparator<String>() {
@Override
public int compare(String time1, String time2) {
// Sorting implementation here
}
});