Enthält für die Liste der Paare

8
%Vor%

Wie sollte ich überprüfen, ob die Liste lp 1 und 2 enthält, d. h. das Paar ("1", "2").

    
kal 10.02.2011, 01:50
quelle

2 Antworten

7

Ihre Klasse Pair muss equals() und hashCode() implementieren und Sie sind fertig. List.contains() wird mit der Methode equals() des Typs implementiert. Weitere Informationen finden Sie in der API für List.contains() . (Bearbeitet ein wenig um Kommentare von @maaartinus zu beantworten, deren Antwort du lesen solltest b / c die Beobachtungen sind solide, und es ist ein bisschen lächerlich für mich, sie hier einzutragen. Wie maaartinus darauf hinweist, wäre eine Best-Practice hier Vermeiden Sie fehleranfällige manuelle Definitionen für equals und hashcode und bauen Sie stattdessen auf Guavas Hilfsfunktionen für Nullable gleich und hashCode für n Objekte ).

%Vor%

Mit passender equals() können Sie jetzt tun:

%Vor%

In Reaktion auf die folgenden Kommentare wäre es vielleicht besser, eine gute Referenz für "Warum muss ich hashCode() implementieren?" hinzuzufügen.

andersoj 10.02.2011, 01:53
quelle
1

Die Implementierung in der Antwort von andersoj

%Vor%

ist falsch: Die Null-Tests legen eindeutig nahe, dass null ein zulässiger Wert für links und rechts ist. Es gibt also mindestens zwei Probleme:

  • new Pair(null, null).hashCode() löst NPE
  • aus
  • new Pair(null, null) ist NICHT gleich selbst!

Schauen Sie sich Guava Klassenobjekte für eine korrekte Implementierung an. Verwenden Sie es oder schreiben Sie eine statische Hilfsmethode wie

%Vor%

und benutze sie immer.

Schreiben Sie niemals equals mit einem Null-Test.

Es ist zu leicht, es zu blasen, und niemand hat es bemerkt. Mit dem Helfer ist es einfach, es richtig zu machen:

%Vor%

Natürlich ist das Verbot von Nullen im Konstruktor auch eine Option.

    
maaartinus 10.02.2011 03:24
quelle

Tags und Links