web-dev-qa-db-ja.com

Java8のラムダを使用してストリームを逆の順序でソートする方法

私はリストをソートするために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());
133
Elad Benda2

あなたがリンクしたソリューションを JavaのArrayList <Long>を降順で並べ替えるにはどうすればいいですか? で処理することができます。

.sorted((f1, f2) -> Long.compare(f2.lastModified(), f1.lastModified())

f2 Long.compareの最初の引数で、2番目の引数ではないため、結果は逆になります。

180
Adrian Leonhard

あなたのストリーム要素がComparableを実装するならば、解決策はより簡単になります:

 ...stream()
 .sorted(Comparator.reverseOrder())
106
GKislin

つかいます

Comparator<File> comparator = Comparator.comparing(File::lastModified); 
Collections.sort(list, comparator.reversed());

それから

.forEach(item -> item.delete());
48
Vishnudev K

メソッド参照を使用できます。

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());
26
iFederx

代替方法の共有:

_ 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());
12
Chang

これは、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());
        }
    }
}
3
ManoDestra

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()));
    }
}
0