私はリストをソートするためにJavaのラムダを使っています。
どうやってそれを逆に並べ替えることができますか?
私はこれを見ました post 、しかし私はJava 8 lambdaを使いたいです。
これが私のコードです(私は* -1を使いました)。
Arrays.asList(files).stream()
.filter(file -> isNameLikeBaseLine(file, baseLineFile.getName()))
.sorted(new Comparator<File>() {
public int compare(File o1, File o2) {
int answer;
if (o1.lastModified() == o2.lastModified()) {
answer = 0;
} else if (o1.lastModified() > o2.lastModified()) {
answer = 1;
} else {
answer = -1;
}
return -1 * answer;
}
})
.skip(numOfNewestToLeave)
.forEach(item -> item.delete());
あなたがリンクしたソリューションを JavaのArrayList <Long>を降順で並べ替えるにはどうすればいいですか? で処理することができます。
.sorted((f1, f2) -> Long.compare(f2.lastModified(), f1.lastModified())
f2 はLong.compare
の最初の引数で、2番目の引数ではないため、結果は逆になります。
あなたのストリーム要素がComparable
を実装するならば、解決策はより簡単になります:
...stream()
.sorted(Comparator.reverseOrder())
つかいます
Comparator<File> comparator = Comparator.comparing(File::lastModified);
Collections.sort(list, comparator.reversed());
それから
.forEach(item -> item.delete());
メソッド参照を使用できます。
import static Java.util.Comparator.*;
import static Java.util.stream.Collectors.*;
Arrays.asList(files).stream()
.filter(file -> isNameLikeBaseLine(file, baseLineFile.getName()))
.sorted(comparing(File::lastModified).reversed())
.skip(numOfNewestToLeave)
.forEach(item -> item.delete());
メソッド参照の代わりにラムダ式を使うことができるので、比較の引数は次のようになります。
.sorted(comparing(file -> file.lastModified()).reversed());
代替方法の共有:
_ asc _
List<Animal> animals = this.service.findAll();
animals = animals.stream().sorted(Comparator.comparing(Animal::getName)).collect(Collectors.toList());
_ desc _
List<Animal> animals = this.service.findAll();
animals = animals.stream().sorted(Comparator.comparing(Animal::getName).reversed()).collect(Collectors.toList());
これは、Java 8とその逆の Comparator を使うことで簡単にできます。
ディレクトリからファイルのリストを作成しました。ソートのために単純なComparatorを使用してソートされていない、ソートされた、逆ソートされた後に表示されます。
以下のコードを参照してください。
package test;
import Java.io.File;
import Java.util.Arrays;
import Java.util.Comparator;
import Java.util.Date;
import Java.util.List;
import Java.util.stream.Collectors;
public class SortTest {
public static void main(String... args) {
File directory = new File("C:/Media");
File[] files = directory.listFiles();
List<File> filesList = Arrays.asList(files);
Comparator<File> comparator = Comparator.comparingLong(File::lastModified);
Comparator<File> reverseComparator = comparator.reversed();
List<File> forwardOrder = filesList.stream().sorted(comparator).collect(Collectors.toList());
List<File> reverseOrder = filesList.stream().sorted(reverseComparator).collect(Collectors.toList());
System.out.println("*** Unsorted ***");
filesList.forEach(SortTest::processFile);
System.out.println("*** Sort ***");
forwardOrder.forEach(SortTest::processFile);
System.out.println("*** Reverse Sort ***");
reverseOrder.forEach(SortTest::processFile);
}
private static void processFile(File file) {
try {
if (file.isFile()) {
System.out.println(file.getCanonicalPath() + " - " + new Date(file.lastModified()));
}
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
Java 8コレクションでファイルリストをソートする
CollectionsとComparator Java 8を使用してファイルリストをソートする方法の例。
import Java.io.File;
import Java.util.ArrayList;
import Java.util.Collections;
import Java.util.Comparator;
import Java.util.List;
public class ShortFile {
public static void main(String[] args) {
List<File> fileList = new ArrayList<>();
fileList.add(new File("infoSE-201904270100.txt"));
fileList.add(new File("infoSE-201904280301.txt"));
fileList.add(new File("infoSE-201904280101.txt"));
fileList.add(new File("infoSE-201904270101.txt"));
fileList.forEach(x -> System.out.println(x.getName()));
Collections.sort(fileList, Comparator.comparing(File::getName).reversed());
System.out.println("===========================================");
fileList.forEach(x -> System.out.println(x.getName()));
}
}