2016-04-20 2 views
0

Ich versuche, eine Methode zu erstellen, die eine Liste, indem sortiert:Sortiere einen Java-Stream mit einem nicht-gesamten Sortierkriterium.

private List<Processor> getByPriority(){       
    return processors.stream().sorted(new ProcessorComparator()).collect(Collectors.toList()); 
} 

Aber ich lese in der Comprator javadoc, die Bedürfnisse vergleichen insgesamt Ordnungsrelation sein. Das heißt, dass keine zwei Komparatoren die gleiche Priorität haben müssen, wenn sie nicht gleich sind. Dies ist möglicherweise nicht der Fall.

Ich habe versucht, diesen einfachen Komparator:

public class ProcessorComparator implements Comparator<TTYMessageProcessor<?>>{ 

    @Override 
    public int compare(Processor processor1 , Processor processor2) {   
     return processor1.getPriority() - processor2.getPriority(); 
    }  
} 

Natürlich konnte ich den Prozessor vergleichbar machen, aber ich möchte Änderungen an alle proccessors vermeiden. Gibt es keine Möglichkeit, sie mit Streams zu sortieren? Als Alternative könnte ich meine eigene Methode schreiben oder einen komplexeren Komparator erstellen, aber ich bin überrascht, dass es keine elegantere Lösung gibt.

+4

Wenn Sie nicht kümmern sich um die Bestellung von Prozessoren mit gleicher Priorität, das ist eine vollkommen feine Komparator als die "Gleichheit" in diesem Fall als die Gleichheit der Prozessorpriorität definiert ist, nicht die Prozessoren selbst – BeyelerStudios

+0

Es wird nicht sein kohärent mit der equals-Methode nach javadoc. Aber ich bin mir der Konsequenzen nicht wirklich sicher. Ich möchte nur sicherstellen, dass der Stream es nicht schon als vorhanden ansieht und lösche es. Auf der anderen Seite macht es mir nichts aus, wenn Prozessoren mit der gleichen Reihenfolge zufällig sortiert werden. Eines Tages erscheint Pc (p = 2) vor Pb (p = 2) und umgekehrt. Ihr Satz "Gleichheit der Prozesspriorität gegen Gleichheit der Objekte wurde erleuchtet" – borjab

+0

Ich würde Sie verwenden Java 8, das ist viel komplizierter als es sein muss: Verwenden Sie 'Comparator.comparingInt (Prozessor :: getPriority)'. –

Antwort

1

references die die Elemente des ursprünglichen Strom liest erhalten:

Gibt einen Strom, der aus den Elementen dieses Stroms, sortiert nach dem vorgesehenen Komparator.

Keine Elemente werden entfernt, gelöscht oder dupliziert. Die gleichen Elemente kommen aus der Art, wie hineingehen, einfach neu geordnet.

Edit: die docs sagen, auch für Comparator.compare

Es ist allgemein der Fall ist, aber nicht unbedingt erforderlich, dass (vergleiche (x, y ) == 0) == (x.equals (y)). Im Allgemeinen sollte jeder Vergleicher, der diese Bedingung verletzt, diese Tatsache deutlich anzeigen. Die empfohlene Sprache ist "Hinweis: Dieser Komparator führt Ordnungen, die sind inkonsistent mit gleich."

Dies kann Verwirrung über equals einzuführen, wenn in Karten oder Sätze verwendet:

Vorsicht ist geboten, wenn ein Komparator fähig Erhebung eines Ordnungs inkonsistent mit equals unter Verwendung eines sortier gesetzt, um (oder sortierte Karte). Angenommen, eine sortierte Menge (oder sortierte Karte) mit einem expliziten Komparator c wird mit Elementen (oder Schlüsseln) aus einer Menge S verwendet. Wenn die durch c auf S auferlegte Ordnung mit equals inkonsistent ist, wird die sortierte Menge (oder sortiert Karte) wird sich "seltsam" verhalten. Insbesondere wird der sortierte Satz (oder sortierte Karte) gegen den allgemeinen Vertrag für Satz (oder Karte) verstoßen, der in Gleichen definiert wird.

Die Verwirrung angehoben wird, wenn Sie über Comparator als Abstraktion des Schlüssel-Wert-Paares denken: Sie würden nicht zwei Paare erwarten, dass sie gleich bei ihren Schlüssel waren gleich. Es bedeutet nur, dass eine Eigenschaft dieser Werte (d. H. Ihre Schlüssel) als gleich betrachtet wird. Wenn Sie möchten, dass ein Objekt Comparable in einer mit equals konsistenten Weise ist, implementieren Sie am besten die gleichnamige Schnittstelle Comparable.

+0

@borjab Was Sie hinzugefügt haben, gilt überhaupt nicht für das Sortieren einer Liste. Für Sets und Maps sehen Sie es so: Komparator abstrahiert das Konzept, ein Schlüssel/Wert-Paar zu haben, in dem Sie Paare für ihren Schlüssel sortieren, niemals gibt es eine Annahme, dass das Paar gleich einem anderen ist, wenn ihre Schlüssel gleich sind. In der Tat stimme ich in diesem Sinne nicht mit der tatsächlichen Wahl der Dokumentationsform überein * Es ist im Allgemeinen der Fall ... *, es ist im Allgemeinen ** nicht ** der Fall, andernfalls würde man 'Comparable.compareTo' nicht einen externen' Comparator implementieren "... – BeyelerStudios

Verwandte Themen