Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java或Groovy中对时间字符串列表进行排序_Java_Sorting_Groovy - Fatal编程技术网

如何在Java或Groovy中对时间字符串列表进行排序

如何在Java或Groovy中对时间字符串列表进行排序,java,sorting,groovy,Java,Sorting,Groovy,我有一个字符串列表,每个字符串包含如下时间: “上午03:00”、“下午12:30”、“16:15” 我需要按顺序对它们进行排序:将“am”时间放在第一位并比较小时,而不仅仅是字符串中的第一位数字。所有Java排序机制——例如,集合.sort()方法——使用(或可以使用)比较器——您自己编写的实现Java.util.comparator的类的实例。该接口有一个compare()方法,您可以实现它来进行任何类型的比较。这就是你在这里需要做的。正如@Ernest所说,你需要使用一个比较器。您可以使用

我有一个字符串列表,每个字符串包含如下时间:

“上午03:00”、“下午12:30”、“16:15”


我需要按顺序对它们进行排序:将“am”时间放在第一位并比较小时,而不仅仅是字符串中的第一位数字。

所有Java排序机制——例如,
集合.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
     } 
 });
列表时间;
Collections.sort(times,new Comparator(){
@凌驾
公共int比较(字符串time1,字符串time2){
//这里的排序实现
} 
});
使用该类确定表示每个字符串的时间,然后在排序时比较该数值。看起来您正在处理的时间字符串可能有不同的格式,因此我编辑了答案以支持格式字符串
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.text.DateFormat;
导入java.text.ParseException;
导入java.text.simpleDataFormat;
导入java.util.*;
公共类TimeStringComparator实现Comparator{
private DateFormat primaryFormat=新的SimpleDateFormat(“h:mm a”);
private DateFormat secondaryFormat=新的SimpleDateFormat(“H:mm”);
@凌驾
公共整数比较(字符串时间1,字符串时间2){
返回时间单位毫秒(时间1)-时间单位毫秒(时间2);
}
公共整数时间单位毫秒(字符串时间){
返回时间单位为毫秒(时间,主格式);
}
private int timeInMillis(字符串时间,日期格式){
//如果有些时候有am/pm,而有些时候没有,那么在解析时间时可能需要更高级的逻辑。
试一试{
日期=format.parse(时间);
return(int)date.getTime();
}捕获(解析异常){
if(格式!=secondaryFormat){
返回时间单位为毫秒(时间,秒格式);
}否则{
投掷e;
}
}
}
公共静态void main(字符串[]args){
List times=Arrays.asList(新字符串[]{“03:00am”、“12:30pm”、“16:15”});
排序(times,new TimeStringComparator());
系统输出打印项次;
}
}

这适用于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进行尝试