Java Wert vergleichen?

...komplette Frage anzeigen

2 Antworten

Wenn ich dich richtig verstanden habe, hast du eine Klasse mit mehreren Eigenschaften:

class Katze {

   private String name, rasse;

   public Katze(String name, String rasse) {
     this.name = name;
     this.rasse = rasse;
   }

  public String getName(){ return this.name; }
  public String getRasse(){ return this.rasse; }

}

Du hast mehrere Katzen in einer Liste:

List<Katze> katzen = new ArrayList<>();

katzen.add(new Katze("Muschi", "Siam"));
katzen.add(new Katze("Mimi", "Sphinx"));
katzen.add(new Katze("Susi", "Siam"));
katzen.add(new Katze("Honey", "Wild"));

Und du möchtest nun alle Siam-Katzen gefiltert haben, so kannst du ab Java 8 mittels Streams bereits filtern und in einer neuen Liste speichern. 

List<Katze> siamKatzen = katzen.stream().filter((Katze t) -> "Siam".equals(t.getRasse())).collect(Collectors.toList());

Bei Stream#Filter wird ein sogenanntes Predicate erwartet, im obigen Beispiel ist dies als gekürzte Lambda Form aufgeführt. 

Diese anonyme Innere Klasse würde ausformuliert so aussehen:

new Predicate<Katze>() {

@Override
public boolean test(Katze t) {
return "Siam".equals(t.getRasse());
}
}

hierbei ist der Return Wert entscheidend: Wird wahr zurück gegeben, wird dieser wert an die neue Liste angefügt, wenn nicht, dann nicht.

Antwort bewerten Vielen Dank für Deine Bewertung
Enyang 17.05.2017, 10:47

wow, das ist mal eine gute Antwort! Vielen vielen Dank! Ich probier das mal gleich aus, aber 2 Fragen hätte ich noch: Was hat es mit der anonymen inneren Klasse auf sich? Ist es eine neue Klasse, die ich schreiben muss? Und das folgende Zeichen, was du in den Code geschrieben hast, wird doch vom Compiler nicht gelesen bzw. wird gemeldet oder?

->
0
KnusperPudding 17.05.2017, 11:03
@Enyang

Was hat es mit der anonymen inneren Klasse auf sich? Ist es eine neue Klasse, die ich schreiben muss? 

Ich versuch es hier mal am konkreten Beispiel zu erklären ohne zu weit auszuholen, falls etwas unklar daran sein sollte: Einfach fragen.

die Methode: filter() erwartet als Parameter eine Instanz von "Predicate".

Predicate selbst ist ein Interface, das 'grob gesagt' so aussieht:

public interface Predicate<T> {

boolean test(T t); }

Von einem Interface kann man nicht 'ohne weiteres' einfach eine Instanz-Bilden, Denn man muss die Interface-Methoden implementieren.

Konkret sieht das eben so aus:

  Predicate<Katze> pred = new Predicate<Katze>() {
@Override
public boolean test(Katze t) {
return "Siam".equals(t.getRasse());
}
}

Da du dafür eben keine Extra-Klasse schreiben musst, handelt es sich um eine Anonyme-Klasse.

Und das folgende Zeichen, was du in den Code geschrieben hast, wird doch vom Compiler nicht gelesen bzw. wird gemeldet oder?

Doch wird es. Aber erst ab Java 8. Diese Schreibweise nennt sich 'Lambda'.

0
Enyang 17.05.2017, 12:01
@KnusperPudding

Und was ist wenn man nicht "Siam" in Vergleich setzt, sondern ein Objekt bzw. die 3 Werte, die das Objekt besitzt? :/

0
KnusperPudding 17.05.2017, 12:16
@Enyang

Du kannst selbstverständlich mehrere Eigenschaften kombinieren und Beispielsweise mit && verketten:

return "Siam".equals(t.getRasse()) && "Grau".equals(t.getFarbe()) && "Weiblich".equals.(t.getGeschlecht()) ;

Der Rückgabewert gibt lediglich darüber Aufschluss, ob der Wert nun deinem Suchkriterium entspricht oder nicht.

Sollte das noch nicht reichen, wäre es gut, wenn du dein Vergleichsobjekt benennst und welche Eigenschaften verglichen werden sollen.

0

Jedes vernünftig implementierte Klasse für vergleichbare Objekte hat eine equals-Methode, diese erhält ein anderes Objekt des selben Typs und gibt zurück ob das Parameter-Objekt mit dem aufrufenden Objekt gleich ist mit true bzw. false falls nicht.

Antwort bewerten Vielen Dank für Deine Bewertung
Enyang 17.05.2017, 00:23

aber es geht nicht um den Vergleich zwischen 2 Objekten, es geht um Vergleiche zwischen 1 Objekt und 15 anderen. :/

0
TUrabbIT 17.05.2017, 00:23

Sollte es diese nicht geben, musst du wenn möglich in der Klasse des Objektes eine solche implementieren oder eine vergleichs Methode in deinem Programm umsetzen. der Vergleich mit vielen anderen Objekten lässt sich simpel mit einer for each Schleife lösen oder komplexer falls nötig in einer Art Algorithmus, z.B. Teile und Herrsche Ansatz.

0
TUrabbIT 17.05.2017, 00:29

Du brauchst nur eine Methode die dir sagt ob zwei Objekte gleich sind, der Rest ist eine Schleife die abbricht wenn ein gleiches gefunden ist. in etwa der Art: Objekt a = abcdefg; Objekt e; Für jedes Objekt x in der Liste y tue folgendes: Ist x gleich a? Ja -> e = x; Abbruch; Nein -> weiter. wenn Schleife beendet: gebe e zurück;

1
TUrabbIT 17.05.2017, 00:30

obiges einfach umsetzen in Java Code (alle nötigen Stichworte findest du in meinen Antworten)

0

Was möchtest Du wissen?