文件树比较器

问题描述 投票:0回答:1

我需要compartor按以下方式对路径对象进行排序。

  • 路径对象按以下方式排序:目录优先
  • 目录和文件是按词法顺序排序的(不区分大小写)。

我试过这样的方法。

public int compare(Path a, Path b) {
    File aFile = a.toFile();
    File bFile = b.toFile();

    if (aFile.isDirectory() && bFile.isFile()) {
        return -1;
    }

    return a.compareTo(b);
}

它给出了正确的目录顺序和所有目录之后的文件,但这不是我需要的。我还试过按文件深度和文件类型(目录或文件)进行比较,但完全没有成功。

请看下面的例子。Tree view

java sorting comparator
1个回答
0
投票

基本上有三种情况我们需要检查。

  • Path a 是否是一个目录和 Path b 是不。(所以。a < b)
  • Path b 是一个目录和 Path a 是不。(所以。b < a)
  • 否则 Path aPath b 是同一种类型(都是目录或文件),我们通过它们的名字来比较。

将其转化为代码。

@Override
public int compare(Path a, Path b) {
    final File aFile = a.toFile();
    final File bFile = b.toFile();

    if (aFile.isDirectory() && !bFile.isDirectory()) {
        return -1;
    } else if (!aFile.isDirectory() && bFile.isDirectory()) {
        return 1;
    } else {
        return a.toString().compareToIgnoreCase(b.toString());
    }
}

注意,为了不区分大小写的比较,我们要将... PathString 并使用 String#compareToIgnoreCase [1].

--

[1] https:/docs.oracle.comenjavajavase11docsapijava.basejavalangString.html#compareToIgnoreCase(java.lang.String)

© www.soinside.com 2019 - 2024. All rights reserved.