【问题标题】:Sorting an array of files by date in name按名称中的日期对文件数组进行排序
【发布时间】:2021-04-06 07:01:28
【问题描述】:

我需要按日期对文件数组进行排序,日期是文件名的一部分,例如:"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();

    }
}

我知道这里有很多需要解决的问题,但现在我想了解为什么会这样:

“比较方法违反了它的一般约定!”

【问题讨论】:

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

标签: java arrays string sorting date


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    @Bertolla 您需要添加一个等号大小​​写。如果相等则返回 0,否则返回 -1。然后做一个更大或更小的比较案例。

    【讨论】:

      【解决方案3】:

      代码审查:

      • 如果20200611_2130.datFri Nov 06 21:30:00,则将您的模式更改为"yyyyddMM_HHmm"
      • 您应该在catch 块中返回something,例如Long.MIN_VALUE
      • 如果文件名不是日期,则添加第二个比较器,例如作为字符串比较。

      您的代码可能如下所示:

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-23
        • 2016-09-30
        相关资源
        最近更新 更多