4

文字列のリストがあり、それぞれに次のような時間が含まれています。

「午前03:00」、「午後12:30」、「16:15」

それらを順番に並べ替える必要があります。文字列の最初の数字だけでなく、「am」時間を最初に置き、時間を比較します。

4

4 に答える 4

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で試行し、失敗した場合はAM/PMなしで試行します

于 2012-08-15T20:01:22.377 に答える
4

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);
   }

}
于 2012-08-15T19:52:39.993 に答える
3

Javaのすべてのソート機構(たとえば、メソッド)は、コンパレーター(を実装する自分で作成したクラスのインスタンスCollections.sort())と連携します(または連携できます) 。そのインターフェースにはメソッドがあり、それを実装して任意の種類の比較を行うことができます。それがあなたがここでする必要があることです。java.util.Comparatorcompare()

于 2012-08-15T19:44:06.607 に答える
2

@Ernestが言ったように、コンパレータを使用する必要があります。あなたはあなたのリストでこのようなことをすることができます:

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

        // Sorting implementation here
     } 
 });
于 2012-08-15T19:48:25.413 に答える