Mit Java Stream nach mehreren Bedingungen sortieren

Vor kurzem habe ich zum ersten Mal seit einem halben Jahr Java geschrieben. Früher habe ich in meinem Unternehmen ** Java7 (!) ** verwendet, jetzt verwende ich Java8.

Ich benutze "Stream" ziemlich oft und habe es aufgeschrieben, weil ich neulich erfahren habe, dass es nach mehreren Bedingungen sortiert werden kann.

Java Stream API Stream (Java Platform SE 8 )

API, die aggregierte Operationen wie iterative Verarbeitung und parallele Verarbeitung unterstützt.

Durch die Kombination mit einem Lambda-Ausdruck (Pfeilfunktion in JS) kann dieser einfach beschrieben werden, ohne die erweiterte for-Syntax zu verwenden.

Nach mehreren Bedingungen sortieren

Dies ist über die Schnittstelle Comparator möglich.

Sie können nach mehreren Bedingungen sortieren, indem Sie die Sortierbedingungen mit den Methoden "compare ()" und "thenComparing ()" angeben und an "sorted ()" des "Streams" übergeben.

Beispielcode

Bitte verzeihen Sie mir die Komplexität des Designs.

Klasse "Artikel"

Article.java


import java.time.LocalDate;

public class Article {

  /**Mitwirkender*/
  private String contributor;

  /**Datum der Veröffentlichung*/
  private LocalDate date;

  /**Anzahl der Likes*/
  private int goodCount;

  /**Konstrukteur*/
  public Article(String contributor, LocalDate date, int goodCount) {
    this.contributor = contributor;
    this.date = date;
    this.goodCount = goodCount;
  }

  /** Getter, Setter */
  public String getContributor() {
    return this.contributor;
  }

  public void setContributor(String contributor) {
    this.contributor = contributor;
  }

  public LocalDate getDate() {
    return this.date;
  }

  public void setDate(LocalDate date) {
    this.date = date;
  }

  public int getGoodCount() {
    return this.goodCount;
  }

  public void setGoodCount(int goodCount) {
    this.goodCount = goodCount;
  }

}

Stream Klasse

Stream.java


import java.time.LocalDate;
import java.util.Arrays;
import java.util.List;

public class Stream {
  public static void main(String[] args) {
    //Datengenerierung
    Article a1 = new Article("Taro", LocalDate.of(2018, 7, 11), 15);
    Article a2 = new Article("Taro", LocalDate.of(2015, 11, 1), 53);
    Article a3 = new Article("Taro", LocalDate.of(2015, 10, 31), 54);

    Article a4 = new Article("Hanako", LocalDate.of(2017, 2, 5), 53);
    Article a5 = new Article("Hanako", LocalDate.of(2016, 11, 1), 160);
    Article a6 = new Article("Hanako", LocalDate.of(2012, 8, 20), 22);

    Article a7 = new Article("Pochi", LocalDate.of(2013, 3, 16), 38);
    Article a8 = new Article("Pochi", LocalDate.of(2011, 9, 25), 200);
    Article a9 = new Article("Pochi", LocalDate.of(2018, 4, 13), 10);

    //Listenerstellung
    List<Article> list = Arrays.asList(a1, a2, a3, a4, a5, a6, a7, a8, a9);
    list.stream().forEach(a ->
      System.out.println(a.getContributor() + " " + a.getDate() + " " + a.getGoodCount()));

  }
}

Vorerst, wenn Sie eine Liste von "a1" bis "a9" ausgeben

Ausgabeergebnis


Taro 2018-07-11 15
Taro 2015-11-01 53
Taro 2015-10-31 54
Hanako 2017-02-05 53
Hanako 2016-11-01 160
Hanako 2012-08-20 22
Pochi 2013-03-16 38
Pochi 2011-09-25 200
Pochi 2018-04-13 10

Wird sein.

Sortierverarbeitung

sorted (Java Platform SE 8)

Übergeben Sie "Comparator" als Argument und sortieren Sie in der angegebenen Reihenfolge.

Nach Einzelart sortieren

In einem Wörterbuch nach Namen sortieren.

Stream.java


//Erstellt von Comparator
Comparator<Article> comparator = Comparator.comparing(Article::getContributor);
//Nach Posternamen sortieren
list.stream().sorted(comparator)
  .forEach(a ->
    System.out.println(a.getContributor() + " " + a.getDate() + " " + a.getGoodCount()));

Ausgabeergebnis


Hanako 2017-02-05 53
Hanako 2016-11-01 160
Hanako 2012-08-20 22
Pochi 2013-03-16 38
Pochi 2011-09-25 200
Pochi 2018-04-13 10
Taro 2018-07-11 15
Taro 2015-11-01 53
Taro 2015-10-31 54

Sie können auch nach anderen Elementen sortieren.

thenComparing thenComparing (Java Platform SE 8)

Eine Methode, mit der Sie Vergleichsbedingungen verketten können. Verwenden Sie wie folgt.

comparator


Comparator.comparing(...).thenComparing(...).thenComparing(...);

Wenn die vorherigen Bedingungen gleich sind ("gleich"), führen Sie einen weiteren Vergleich durch.

Gibt einen Wörterbuchsequenzkomparator mit dem anderen Komparator zurück. Wenn dieser Vergleicher die beiden Elemente als gleich betrachtet (dh (a, b) == 0), wird zur Bestimmung der Reihenfolge andere verwendet.

Nach mehreren Elementen sortieren

Sortieren nach Name-> Postdatum

Stream.java


//Erstellt von Comparator
Comparator<Article> comparator =
  Comparator.comparing(Article::getContributor).thenComparing(Article::getDate);
//Sortierverarbeitung
list.stream().sorted(comparator)
  .forEach(a ->
    System.out.println(a.getContributor() + " " + a.getDate() + " " + a.getGoodCount()));

Ausgabeergebnis


Hanako 2012-08-20 22
Hanako 2016-11-01 160
Hanako 2017-02-05 53
Pochi 2011-09-25 200
Pochi 2013-03-16 38
Pochi 2018-04-13 10
Taro 2015-10-31 54
Taro 2015-11-01 53
Taro 2018-07-11 15

Sortieren nach Name-> Likes

Stream.java


//Erstellt von Comparator
Comparator<Article> comparator =
  Comparator.comparing(Article::getContributor).thenComparing(Article::getGoodCount);
//Sortierverarbeitung
list.stream().sorted(comparator)
  .forEach(a ->
    System.out.println(a.getContributor() + " " + a.getDate() + " " + a.getGoodCount()));

Ausgabeergebnis


Hanako 2012-08-20 22
Hanako 2017-02-05 53
Hanako 2016-11-01 160
Pochi 2018-04-13 10
Pochi 2013-03-16 38
Pochi 2011-09-25 200
Taro 2018-07-11 15
Taro 2015-11-01 53
Taro 2015-10-31 54

Wenn Sie in aufsteigender Reihenfolge möchten, fügen Sie "reverse ()" hinzu

Stream.java


//Erstellt von Comparator
Comparator<Article> comparator =
  Comparator.comparing(Article::getContributor).thenComparing(Article::getGoodCount).reversed();
//Sortierverarbeitung
list.stream().sorted(comparator)
  .forEach(a ->
    System.out.println(a.getContributor() + " " + a.getDate() + " " + a.getGoodCount()));

Ausgabeergebnis


Taro 2015-10-31 54
Taro 2015-11-01 53
Taro 2018-07-11 15
Pochi 2011-09-25 200
Pochi 2013-03-16 38
Pochi 2018-04-13 10
Hanako 2016-11-01 160
Hanako 2017-02-05 53
Hanako 2012-08-20 22

Impressionen

Referenz

Stream (Java Platform SE 8 ) Comparator (Java Platform SE 8 )

Recommended Posts

Mit Java Stream nach mehreren Bedingungen sortieren
[Java] Nach mehreren Schlüsseln sortieren, wobei Null berücksichtigt wird
Blasensortierung mit ArrayList (JAVA)
[Java8] Verwenden Sie stream, um Arrays vom Typ int in absteigender Reihenfolge zu sortieren
Geben Sie in Swift mehrere Sortierbedingungen an
Ich habe versucht, die Java8 Stream API zu verwenden
Verketten Sie Zeichenfolgen, die von Mehrobjektmethoden in Java Stream zurückgegeben werden
Versuchen Sie es mit der Stream-API in Java
Nach mehreren Feldern in der Klasse sortieren
[Java] Generieren Sie mithilfe der Stream-API eine verengte Liste aus mehreren Listen
Java Bubble Sort
Java Stream API
Java Select Sort
Java 8 studieren (Stream)
Duplikatprüfung für Java8-Stream (ordentlich mit Collector schreiben)
Java Insert Sort
Java Stream-Beendigung
[Java] Stream-Verarbeitung
Java 9 Optional :: stream
Studieren von Java8 (z. B. Lesen von Dateien mit Stream)
[Java] Sortieren Sie die Liste mit Streams und Lambda-Ausdrücken
Java: Verwenden Sie Stream, um den Inhalt einer Sammlung zu sortieren
[Java] Entwicklung mit mehreren Dateien mittels Paket und Import
[Java] Stream Collectors Hinweis
[Java] Stream API-Stream-Generierung
[Java] Stream API / Map
Mehrfacher Ersatz für Java-Zeichenfolgen
Java Japanisch (Kanji) Sortieren
Schrottpraxis mit Java ②
Informationen zur Java8-Stream-Reduzierung
Schrottpraxis mit Java ①
Grobe Zusammenfassung des Java8-Streams
Hinweis Nr. 5 "HashMap-Werte haben mehrere Werte unter Verwendung von Klassen" [Java]
Verwenden mehrerer Java-Versionen mit Brew auf Mac + jEnv