[JAVA] Nach mehreren Feldern in der Klasse sortieren

Überblick

Dies ist ein Beispielprogramm, das nach mehreren Feldern in der Klasse sortiert.

Beispielcode

import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.time.FastDateFormat;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class Sample {

    public static void main(String ... args) throws Exception {
        FastDateFormat fdf = FastDateFormat.getInstance("yyyy-MM-dd");

        /**Beispieldaten*/
        List<Data> sampleList = new ArrayList<>();
        sampleList.add(new Data(1L,"CCC", fdf.parse("2017-02-26")));
        sampleList.add(new Data(1L,"BBB", fdf.parse("2017-02-27")));
        sampleList.add(new Data(1L,"KKK", fdf.parse("2017-02-28")));
        sampleList.add(new Data(2L,"AAA", fdf.parse("2017-02-25")));
        sampleList.add(new Data(2L,"DDD", fdf.parse("2017-02-24")));
        sampleList.add(new Data(2L,"QQQ", fdf.parse("2017-02-23")));
        sampleList.add(new Data(3L,"EEE", fdf.parse("2017-02-22")));
        sampleList.add(new Data(3L,"FFF", fdf.parse("2017-02-20")));
        sampleList.add(new Data(3L,"OOO", fdf.parse("2017-02-21")));

        //Geben Sie die Felder an, die Sie sortieren möchten, getrennt durch Kommas.
        //Am Anfang des Feldnamens-Wenn hinzugefügt wird, wird es invertiert.
        List<Data> result = sampleList.stream()
                .sorted(Data.compare("id,-updated"))
                .collect(Collectors.toList());

        result.forEach(data -> System.out.println(ToStringBuilder.reflectionToString(data)));
        //Ausführungsergebnis
        // [id=1,name=KKK,updated=Tue Feb 28 00:00:00 JST 2017]
        // [id=1,name=BBB,updated=Mon Feb 27 00:00:00 JST 2017]
        // [id=1,name=CCC,updated=Sun Feb 26 00:00:00 JST 2017]
        // [id=2,name=AAA,updated=Sat Feb 25 00:00:00 JST 2017]
        // [id=2,name=DDD,updated=Fri Feb 24 00:00:00 JST 2017]
        // [id=2,name=QQQ,updated=Thu Feb 23 00:00:00 JST 2017]
        // [id=3,name=EEE,updated=Wed Feb 22 00:00:00 JST 2017]
        // [id=3,name=OOO,updated=Tue Feb 21 00:00:00 JST 2017]
        // [id=3,name=FFF,updated=Mon Feb 20 00:00:00 JST 2017]

    }

    private static class Data {
        private static Comparator<Data> ID_COMP = Comparator.comparing(Data::getId);
        private static Comparator<Data> NAME_COMP = Comparator.comparing(Data::getName);
        private static Comparator<Data> UPDATED_COMP = Comparator.comparing(Data::getUpdated);
        private static Map<String, Comparator<Data>> SORT_FIELD = new HashMap<>();
        static {
            SORT_FIELD.put("id", ID_COMP);
            SORT_FIELD.put("-id", ID_COMP.reversed());
            SORT_FIELD.put("name", NAME_COMP);
            SORT_FIELD.put("-name", NAME_COMP.reversed());
            SORT_FIELD.put("updated", UPDATED_COMP);
            SORT_FIELD.put("-updated", UPDATED_COMP.reversed());
        }

        public static Comparator<Data> compare(String sortFields) {
            return Arrays.stream(sortFields.split(","))
                    .map(field -> Data.SORT_FIELD.get(field))
                    .reduce(Comparator::thenComparing)
                    .get();
        }

        private Long id;
        private String name;
        private Date updated;

        public Data(Long id, String name, Date updated) {
            this.id = id;
            this.name = name;
            this.updated = updated;
        }

        public Long getId() {
            return id;
        }

        public void setId(Long id) {
            this.id = id;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public Date getUpdated() {
            return updated;
        }

        public void setUpdated(Date updated) {
            this.updated = updated;
        }
    }
}

Recommended Posts

Nach mehreren Feldern in der Klasse sortieren
Geben Sie in Swift mehrere Sortierbedingungen an
Ich habe den Paketnamen überprüft, auf den die in der JAR-Datei enthaltene Klasse verweist
[Java] Nach mehreren Schlüsseln sortieren, wobei Null berücksichtigt wird
Wenn Sie sich im Klassennamen verlieren
Benennen und rufen Sie in Ruby übergeordnete Klassenmethoden explizit auf
Implementieren Sie den Algorithmus in Ruby: Tag 2 - Blasensortierung -
Holen Sie sich im Frühjahr mehrere Ressourcen, die dem Muster entsprechen
Format der Protokollausgabe von Tomcat selbst in Tomcat 8
Lesen Sie die Paketerfassung, die von tcpdump mit Java erhalten wurde
Rufen Sie den Namen des Testfalls in der JUnit-Testklasse ab
Fügen Sie den von Doma generierten Quellcode in die Quell-JAR ein
Ein Hinweis zum Initialisieren von Feldern im Java-Lernprogramm
[Ruby / Rails] Legen Sie einen eindeutigen (eindeutigen) Wert in der Klasse fest
Fassen Sie die zusätzlichen Elemente der optionalen Klasse in Java 9 zusammen
Informationen zur StringBuilder-Klasse
Verwendung derselben Mapper-Klasse in mehreren Datenquellen mit Spring Boot + MyBatis
NullpointException in der injizierenden Klasse
So erhalten Sie den Namen einer Klasse / Methode, die in Java ausgeführt wird
Installieren Sie, indem Sie die Version von Django in der Docker-Umgebung angeben
So verbinden Sie die Zeichenfolgen in der Liste durch Kommas getrennt
Bei Verwendung des Konstruktors der Date-Klasse von Java wird das Datum um 1900 vorverlegt.
Finden Sie alle Zeitzonen-IDs heraus, die von der Java TimeZone-Klasse unterstützt werden