Streams - Abfrage absteigend sortieren

Diskutiere Streams - Abfrage absteigend sortieren im Java Basics - Anfänger-Themen Bereich.
S

stefan_jj

Hallo liebe Community,

Ich habe ein Problem bei einer Methode. Leider kann ich die Abfrage nicht absteigend sortieren. Im Prinzip möchte ich eine Liste absteigend nach der Häufigkeit der "Tags" sortieren. Das Limit bedeutet bloß wie viele Tags angezeigt werden sollen. Bspw Top Ten.

aufsteigend klappt es. nur leider wird der ".reversed()"-Befehl nicht zugelassen. Kann mir wer erklären warum? Und wie dann der Code richtig lauten müsste?

Java:
public List<String> topT(int n) {
        List<String> topT = this.stream().flatMap(a -> Arrays.stream(a.getTags()))
                .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
                .entrySet()
                .stream()
                .sorted(Comparator.comparing(Entry::getValue))
                .limit(n)
                .map(b -> b.getKey() + " x " + b.getValue())
                .collect(Collectors.toList());
        for(int i = 0; i < topT.size(); i++) {
            System.out.print(topT.get(i));
            System.out.print("\n");
        }
        return topT;
    }
danke und lg
 
MoxxiManagarm

MoxxiManagarm

aufsteigend klappt es. nur leider wird der ".reversed()"-Befehl nicht zugelassen.
Hast du ihn vielleicht nach der falschen Klammer gesetzt?

Also Vermutung ist du hast ihn so gesetzt:
Java:
.sorted(Comparator.comparing(Entry::getValue)).reversed()
anstatt
Java:
.sorted(Comparator.comparing(Entry::getValue).reversed())
Wenn die Vermutung nicht stimmt, zeig mal deinen Ansatz mit reversed drin und was genau heißt nicht zugelassen? Welche Meldung erscheint?
 
MoxxiManagarm

MoxxiManagarm

Kleiner Tipp noch
Java:
  .map(b -> b.getKey() + " x " + b.getValue())
  .collect(Collectors.toList());
for(int i = 0; i < topT.size(); i++) {
  System.out.print(topT.get(i));
  System.out.print("\n");
}
Wenn du dich für Streams entscheidest zieh es durch ;-)

Java:
.map(b -> b.getKey() + " x " + b.getValue())
.peek(System.out::println)
.collect(Collectors.toList());
 
MoxxiManagarm

MoxxiManagarm

Fachliche Frage darüber hinaus: Wieso heißt die Methode "topT" (steht wohl für TopTen), wenn diese das Limit als Parameter erhält? Wenn ich topT(40) aufrufe, dann ist es wohl kaum mehr eine Top Ten ;-) Lässt du deine Klasse von List erben, dass du auf diese ein stream() anwenden kannst? Ohne den Code zu kennen vermute ich du brichst das Composition over Inheritance "Gesetz"
 
S

stefan_jj

Hallo,

danke für die schnellen Antworten.
folgende Fehlermeldung kommt wenn ich:

Java:
.sorted(Comparator.comparing(Entry::getValue).reversed())
eingebe.

"The type Map.Entry does not define getValue(Object) that is applicable here".


topT steht für TopTags. Nicht für topTen =)
 
L

LimDul

Kurzes Googlen sagt hier was: https://stackoverflow.com/questions/33091946/java-8-stream-flatmap-and-group-by-code-compiler-error
Ist war Älter, aber mit Generics in Streams gibt es immer wieder Probleme.

ich kann den Fehler reproduzieren.

Java:
Comparator<Entry<String, Integer>> comparator = Comparator.comparing(Entry::getValue).reversed();
Compile Fehler

Java:
        Comparator<Entry<String, Integer>> comparator = Comparator.comparing(Entry::getValue);
        comparator = comparator.reversed();
Kompiliert.

Definier dir den Comparator wie in meinem zweiten Beispiel außerhalb des Streams und verwende den da.
 
Flown

Flown

Es sieht so aus also ob du noch mit Java 8 unterwegs bist und da ist die Typinferenz noch etwas holprig:
Java:
.sorted(Map.Entry.comparingByValue(Comparator.reverseOrder())
sollte helfen.
Oder du musst etwas mehr qualifizieren:
Java:
.sorted(Comparator.<Map.Entry<XXX, Long>, Long>comparing(Map.Entry::getValue).reversed())
 
MoxxiManagarm

MoxxiManagarm

Ich kann es leider nicht erklären, finde ich auch komisch. Beim lokalen Test bekomme ich sogar eine andere Fehlermeldung als du. Aber ich kann dir einen Workaround mitgeben:
Java:
.sorted(Comparator.comparing(Entry::getValue, Comparator.reverseOrder()))
 
S

stefan_jj

Vielen Dank für eure Hilfe.

Es sieht so aus also ob du noch mit Java 8 unterwegs bist und da ist die Typinferenz noch etwas holprig
nope- arbeite mit Java13 =)

alle 3 Varianten haben funktioniert.
letztendlich habe ich:
Java:
.sorted(Comparator.comparing(Entry::getValue, Comparator.reverseOrder()))
verwendet.

danke nochmal. Das Problem hat mich echt verwirrt gehabt. =)

lg
 
Thema: 

Streams - Abfrage absteigend sortieren

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben