Summary

JTableでファイルとディレクトリをグループ化して別々にソートし、ディレクトリグループが常に先頭になるように設定します。

Source Code Examples

// > dir /O:GN
// > ls --group-directories-first
finalComp = (a, b) -> {
  int dir = getSortOrderDirection(table, i);
  int v = Boolean.compare(b.isDirectory(), a.isDirectory());
  return v == 0 ? baseComp.compare(a, b) : v * dir;
};

private static int getSortOrderDirection(JTable table, int column) {
  return table.getRowSorter().getSortKeys().stream()
      .findFirst()
      .filter(k -> k.getColumn() == column
             && k.getSortOrder() == SortOrder.DESCENDING)
      .map(k -> -1)
      .orElse(1);
}
View in GitHub: Java, Kotlin

Description

上記のサンプルでは、JTableにドラッグ&ドロップで追加したファイルやディレクトリを以下の3種類のComparatorでソートが可能です。

  • 0列目のDefault
    • File#getName()で取得したファイル名Stringで比較
    • Comparator.comparing(File::getName, String.CASE_INSENSITIVE_ORDER);
  • Directory < File
    • ファイル名より先に「ディレクトリ < ファイル」で比較するComparatorを設定
    • Comparator.comparing(File::isDirectory, Comparator.reverseOrder()).thenComparing(baseComp);
  • Group Sorting
    • 昇順の場合は「ディレクトリ < ファイル」、降順の場合は「ディレクトリ > ファイル」として常にディレクトリが優先されるComparatorを設定
    • ディレクトリ同士、ファイル同士の場合はファイル名で比較する
    • ディレクトリ優先の比較結果に対して、現在のソート方向を掛け合わせることで昇順時はディレクトリが上、降順時はディレクトリが下になるように制御
    • lsコマンドの--group-directories-firstオプションを付けた状態と同じソート

Reference

Comment