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-谢谢你的指点,现在我需要弄清楚我没有履行合同的哪一部分。我想这是一个平等的比较,就像一些人已经指出的,是的,我的错。我应该仔细阅读。