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

yyhrrdl8  于 2021-06-27  发布在  Java
关注(0)|答案(3)|浏览(317)

我需要按日期对文件数组进行排序,日期是文件名的一部分,例如: "20200611_2130.dat" . 我试着用:

Arrays.sort(files,new FileNameComparator());
public class FileNameComparator implements Comparator<File> {
    private static SimpleDateFormat formatter =
            new SimpleDateFormat("YYYYddMM_HHmm");

    @Override
    public int compare(File a, File b) {
        try {
            return asTime(a.getName()) > asTime(b.getName()) ? 1 : -1;
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return 0;
    }

    private static long asTime(String filename) throws ParseException {
        return formatter.parse(
                filename.substring(0, filename.lastIndexOf("."))).getTime();

    }
}

我知道这里有很多问题需要解决,但现在我想知道为什么我会得到:
“比较法违反了它的总承包合同!”

nuypyhwy

nuypyhwy1#

@bertolla你需要加一个等号。如果等于,则返回0,否则返回-1。然后做一个更大或更小的比较案例。

xtupzzrd

xtupzzrd2#

当a==b时,比较器不工作。它必须返回0。您当前的实现返回-1。您应该考虑a==b的情况,如果为true,则返回0,然后处理文件名不同的情况。

vulvrdjw

vulvrdjw3#

代码审查:
把图案改成 "yyyyddMM_HHmm" 如果 20200611_2130.datFri Nov 06 21:30:00 .
你应该把东西放在箱子里 catch 例如,块 Long.MIN_VALUE .
如果文件名不是日期,则添加第二个比较器,例如compare as strings。
您的代码可能如下所示:

private static SimpleDateFormat formatter =
        new SimpleDateFormat("yyyyddMM_HHmm");

private static long asTime(String filename) {
    try {
        Date date = formatter.parse(
                filename.substring(0, filename.lastIndexOf(".")));
        return date.getTime();
    } catch (ParseException e) {
        return Long.MIN_VALUE;
    }
}
public static void main(String[] args) {
    String[] fileNames = {
            "20200611_2130.dat",
            "20201511_2130.dat",
            "20200605_2130.dat",
            "20100611_2130.dat",
            "picture.jpg"};

    Arrays.sort(fileNames, Comparator
            .<String>comparingLong(name -> asTime(name))
            .thenComparing(Comparator.naturalOrder()));

    Arrays.stream(fileNames).forEach(System.out::println);
}

输出:

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

相关问题