Comparator#comparing(<Key Extractor>)
ソート項目をcomparing
で指定します。最も簡潔なメソッド参照を使います。項目がbooleanの場合、false,trueの順に並びます。
Java
1var directoryLast = Comparator.comparing(File::isDirectory);
2var extensionOrder = Comparator.comparing(q355216::getFileExtension);
3var nameOrder = Comparator.comparing(File::getName);
4var extensionLast = Comparator.comparing(q355216::hasExtension);
メソッド参照のq355216::getFileExtension
,q355216::hasExtension
は自分で定義したメソッドです。
Java
1static boolean hasExtension(File f) {
2 return f.isFile() && f.getName().lastIndexOf(".") > 0;
3}
4
5static String getFileExtension(File f) {
6 return f.isFile() ? getExtension(f.getName()) : "";
7 }
8
9static String getExtension(String name) {
10 int pos = name.lastIndexOf(".");
11 return (pos <= 0) ? "" : name.substring(pos+1);
12}
Comparator#thenComparingを使用する合成
上で作成した単一のComparatorをthenComparing
で優先度順に合成します。
Java
1// 合成
2var actualOrder = directoryLast.thenComparing(extensionOrder).thenComparing(nameOrder);
いったん、ここまでをヒントとして示します。