Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.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 按名称中的日期对文件数组进行排序_Java_Arrays_String_Sorting_Date - Fatal编程技术网

Java 按名称中的日期对文件数组进行排序

Java 按名称中的日期对文件数组进行排序,java,arrays,string,sorting,date,Java,Arrays,String,Sorting,Date,我需要按文件名中的日期对文件数组进行排序,例如:“20200611_2130.dat”。 我试着用: Arrays.sort(文件,新的FileNameComparator()); 公共类FileNameComparator实现Comparator{ 专用静态SimpleDataFormat格式化程序= 新的简化格式(“yyyydmm_HHmm”); @凌驾 公共整数比较(文件a、文件b){ 试一试{ 返回asTime(a.getName())>asTime(b.getName())?1:-1

我需要按文件名中的日期对文件数组进行排序,例如:
“20200611_2130.dat”
。 我试着用:

Arrays.sort(文件,新的FileNameComparator());
公共类FileNameComparator实现Comparator{
专用静态SimpleDataFormat格式化程序=
新的简化格式(“yyyydmm_HHmm”);
@凌驾
公共整数比较(文件a、文件b){
试一试{
返回asTime(a.getName())>asTime(b.getName())?1:-1;
}捕获(解析异常){
e、 printStackTrace();
}
返回0;
}
私有静态长asTime(字符串文件名)引发ParseException{
返回格式化程序.parse(
filename.substring(0,filename.lastIndexOf(“.”)).getTime();
}
}
我知道这里有很多问题需要解决,但现在我想了解我为什么会得到:

“比较法违反了它的总合同!”


当a==b时,比较器不工作。它必须返回0。您当前的实现返回-1。
您应该考虑A==B和返回0的情况,如果TRUE,那么处理文件名不同的情况。

@ Bertolla,您需要添加一个相等的情况。如果相等,则返回0,否则返回-1。然后进行大小比较。

代码检查:

  • 如果
    20200611\u 2130.dat
    11月6日星期五21:30:00
    ,则将模式更改为
    “yyyydmm\u HHmm”
  • 您应该在
    catch
    块中返回一些内容,例如
    Long.MIN\u值
  • 如果文件名不是日期,请添加第二个比较器,例如“比较为字符串”
您的代码可能如下所示:

专用静态SimpleDataFormat格式化程序=
新的简化格式(“yyyydmm_HHmm”);
私有静态长散列时间(字符串文件名){
试一试{
Date=formatter.parse(
filename.substring(0,filename.lastIndexOf(“.”));
返回日期。getTime();
}捕获(解析异常){
返回Long.MIN_值;
}
}
publicstaticvoidmain(字符串[]args){
字符串[]文件名={
“20200611_2130.dat”,
“20201511_2130.dat”,
“20200605_2130.dat”,
“20100611_2130.dat”,
“picture.jpg”};
排序(文件名、比较器)
.comparingLong(名称->散名(名称))
.然后比较(Comparator.naturalOrder());
Arrays.stream(文件名).forEach(System.out::println);
}
输出:

picture.jpg
20100611_2130.dat
20200605_2130.dat
20200611_2130.dat
20201511_2130.dat

这是否回答了您的问题?看起来日期和时间构成了整个名称(扩展名除外),格式从大到小。字符串比较应该给出正确的结果。@DarkMatter格式不是从大到小,因为天早于月,但感谢您的帮助input@PM77-谢谢你的指点,现在我需要弄清楚我没有履行合同的哪一部分。我想这是一个平等的比较,就像一些人已经指出的,是的,我的错。我应该仔细阅读。