Liste ohne Duplikate

markus2510

Mitglied
Hallo,

Ich möchte in einer Liste Objekte speichern welche namentlich benannte reguläre Ausdrücke darstellen, d.h. die Klasse hat zwei String-Members name und regexp. Nun möchte ich verhindern dass Duplikate in der Liste vorkommen. Unter einem Duplikat verstehe ich in diesem Kontext: Gleicher name ODER gleiche regexp, da es ja keinen Sinn macht dasselbe Muster unter mehreren Namen oder verschiedene Muster mit gleichem Namen zu definieren.

Welche Collection würdet ihr in diesem Fall verwenden? Ich hab zunächst natürlich an ein Set gedacht, aber wie mach ich das mit dem Hashcode in diesem Fall? Die Gleichheit ist ja durch eine ODER Verknüpfung definiert.

Zur Zeit hab ich die Liste indirekt über eine ArrayList abgebildet wobei ich vor jedem add mit contains überprüfe ob das Element schon enthalten ist. Je nach Ergebnis gebe ich wie bei einem Set true oder false zurück. Funktioniert natürlich, aber vielleicht gibt's ja eine bessere Lösung.

Lg, Markus
 

Robat

Top Contributor
Also hast du dir eine eigene Klasse mit 2 String-Attributen gemacht?
Java:
public class Foo {
    private final String name;
    private final String regex;

    public Foo(String name, String regex) {
         this.name = name;
         this.regex = regex:
    }
}

Dann überschreib doch die equals / hashCode Methode um zu prüfen ob 2 Elemente gleich sind. Dann kannst du auch wunderbar ein Set verwenden.
Die meisten IDEs unterstützen dich bereits beim generieren solcher Methoden. Die müsstest du dann ggf. noch an deine Bedürfnisse (Gleichheit bei Namen oder Regex) anpassen.
 

markus2510

Mitglied
Ja so sieht die Klasse aus, in der equals Methode liefere ich true zurück wenn entweder name oder regexp gleich sind. Aber wie müsste die hashcode Methode in diesem Fall aussehen?

Lg, markus
 

markus2510

Mitglied
Hallo,

ich hab jetzt den Namen als Eindeutigkeitskriterium herangezogen und das Problem mit einem LinkedHashSet umgesetzt.

Allerdings ist da eine Frage aufgetaucht:

Hier meine equals-Methode:

Java:
@Override
   public boolean equals (Object obj) {
       System.out.println("equals von Pattern");
       if (obj==this) {
           return true;
       }
      
       if (obj instanceof Pattern) {
           Pattern p=(Pattern) obj;
          
           return name.equals(p.name);
       }
      
       return false;
   }

Wenn ich nun nacheinander versuche Elemente hinzuzufügen dann wird meine equals-Methode scheinbar nur dann aufgerufen wenn das Element bereits existiert ("equals von Pattern" erscheint nur dann auf der Konsole wenn ich versuche bereits vorhandene Elemente nochmals zu adden. Warum ist das so?

Java:
System.out.println(mySet.add(new Pattern("a","")));
System.out.println(mySet.add(new Pattern("b","")));
System.out.println(mySet.add(new Pattern("c","")));
System.out.println(mySet.add(new Pattern("c",""))); -> nur hier wird "equals von Pattern" ausgegeben

Die doHashcode - Methode habe ich so überschrieben:
Java:
@Override
   public int hashCode () {
       return Objects.hash(name);
   }

lg, Markus
 

mrBrown

Super-Moderator
Mitarbeiter
Weil das LinkedHashSet für den Vergleich zu erst hashCode benutzt, diese musst du passend zu equals überschrieben. ;)

equals wird dann nur benutzt, wenn der hashCode gleich ist.
 

mrBrown

Super-Moderator
Mitarbeiter
So wie du es schon machst.

In den ersten Fällen ist immer der hashcode unterschiedlich, also wird das Objekt nicht noch zusätzlich mit equals verglichen. Beim letzten hinzufügen ist der hashcode gleich zu dem vorletztem Objekt, also wird noch mit equals verglichen.
 

thecain

Top Contributor
he general contract of hashCode is:

  • Whenever it is invoked on the same object more than once during an execution of a Java application, the hashCode method must consistently return the same integer, provided no information used in equals comparisons on the object is modified. This integer need not remain consistent from one execution of an application to another execution of the same application.
  • If two objects are equal according to the equals(Object) method, then calling the hashCode method on each of the two objects must produce the same integer result.
  • It is not required that if two objects are unequal according to the equals(java.lang.Object) method, then calling the hashCode method on each of the two objects must produce distinct integer results. However, the programmer should be aware that producing distinct integer results for unequal objects may improve the performance of hash tables.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
alice98 Erste Schritte Liste erstellen ohne vorgefertigte Klassen Java Basics - Anfänger-Themen 1
Hijo2006 Array/Liste ohne Obergrenze Java Basics - Anfänger-Themen 38
T Liste Umformen ohne Warnung Java Basics - Anfänger-Themen 4
D Inhalt einer Liste auf nur ein Wert überprüfen ohne die Liste komplett zu interieren Java Basics - Anfänger-Themen 6
L Randomisierung einer Liste: Ziehen ohne Zurücklegen Java Basics - Anfänger-Themen 5
J Mehrdimensionale Liste erstellen ohne Array Java Basics - Anfänger-Themen 14
R Liste in Variable speichern Java Basics - Anfänger-Themen 6
R Liste und Arrays Java Basics - Anfänger-Themen 12
D 2 ArrayListen gleich sortieren bzw. eine Liste anhand einer anderen Sortieren Java Basics - Anfänger-Themen 6
J Ähnlichen String in Liste finden Java Basics - Anfänger-Themen 6
M Verkettete Liste Java Basics - Anfänger-Themen 1
M Vergleichen, ob eine Liste länger als andere ist Java Basics - Anfänger-Themen 6
H Liste nach String-Länge sortieren Java Basics - Anfänger-Themen 1
D remove Object von einer Liste von Obejcts Java Basics - Anfänger-Themen 3
E Elemente aus Liste entfernen und hinzufügen Java Basics - Anfänger-Themen 3
M Nullpointer beim befüllen meiner Liste im Object Java Basics - Anfänger-Themen 3
D Länge einer Liste aufrufen. Java Basics - Anfänger-Themen 19
B Objekt aus generalisierter Liste entfernen Java Basics - Anfänger-Themen 11
H Liste Knoten NullPointerException Java Basics - Anfänger-Themen 7
W Liste mit Listen in JTable darstellen Java Basics - Anfänger-Themen 1
N Was Passiert mit dem Namen einer Variable, wenn man diese einer Liste Hinzufügt Java Basics - Anfänger-Themen 16
E Suchfunktion in einer Liste Java Basics - Anfänger-Themen 39
T ungeordnete Werte-Paare in einer Liste Java Basics - Anfänger-Themen 7
L Hilfe! Liste mit Items werden ausgegeben aber nicht in zufälliger Reihenfolge Java Basics - Anfänger-Themen 6
berserkerdq2 Warum soll ich shuffle nutzen, um bei Rückgabewert Collection eine Liste zurückzugeben? Java Basics - Anfänger-Themen 3
sserio Wieso werden nicht alle Primzahlen bis 1000 in meine Liste gepackt ? Java Basics - Anfänger-Themen 8
sserio Liste erstellt und ein Problem mit dem Index Java Basics - Anfänger-Themen 8
f3mys Objektwerte in Liste speichern und wieder abrufen Java Basics - Anfänger-Themen 23
H Java verkettete Liste, Wert eines Index zurückgeben Java Basics - Anfänger-Themen 1
K Warum ist die binäre Suche bei der verketteten Liste nicht so effektiv? Java Basics - Anfänger-Themen 3
I 2D-Array Position der Liste ausgeben. Java Basics - Anfänger-Themen 2
I Liste von Infos von einer eigenen Annotation in Liste speichern Java Basics - Anfänger-Themen 0
P Doppelte werte in einer Liste zählen Java Basics - Anfänger-Themen 11
Dorfschmied Kartesisches Produkt von zwei Liste mit Hashmaps<String,String> erstellen Java Basics - Anfänger-Themen 4
Igig1 Autoparkplatz verkettete Liste erstes und letztes Auto Java Basics - Anfänger-Themen 13
thor_norsk Verkette Liste Java Basics - Anfänger-Themen 27
R Rückgabe: verkettete Liste Java Basics - Anfänger-Themen 2
R einfach verkettete Liste Java Basics - Anfänger-Themen 1
R einfach verkettete Liste Java Basics - Anfänger-Themen 12
O Doppelt verkette Liste Element löschen Java Basics - Anfänger-Themen 15
B GUI extension mit einer Liste verbinden Java Basics - Anfänger-Themen 1
B Verkettete Liste durchgehen und einzelne Elemente in neue Liste tun Java Basics - Anfänger-Themen 9
B Bin komplett am verzweifeln :( Verkettete Liste die Objekte hat Attribut auslesen Java Basics - Anfänger-Themen 14
M Java Liste streamen Java Basics - Anfänger-Themen 10
AmsananKING Aussortierung einer Liste Java Basics - Anfänger-Themen 8
A Objekte mit Parametern in eine Liste packen Java Basics - Anfänger-Themen 19
A Korrigierte <String> Liste zurückgeben Java Basics - Anfänger-Themen 22
S Kann nicht auf die Liste zugreifen mit der Methode!? Java Basics - Anfänger-Themen 3
B Datentyp für Einzelnes Objekt oder Liste Java Basics - Anfänger-Themen 9
J Doppelt verkette Liste ich bitte um Hilfe Java Basics - Anfänger-Themen 4
I Liste gruppieren nach Monat? Java Basics - Anfänger-Themen 5
districon Element in Liste einfügen Java Basics - Anfänger-Themen 1
B Hilfe bei Map Liste erstellen Java Basics - Anfänger-Themen 10
Y Einfügen in eine doppelt verkettete Liste Java Basics - Anfänger-Themen 8
Y Knoten an einem gegebenen Index aus einer Liste entfernen. Java Basics - Anfänger-Themen 6
H Daten aus einer Datei in eine Liste speichern Java Basics - Anfänger-Themen 23
Gaudimagspam Linked Liste Java Basics - Anfänger-Themen 4
Z Liste umkehren Java Basics - Anfänger-Themen 1
S Eine Liste kopieren Java Basics - Anfänger-Themen 13
java3690 Java- liste füllen ud die werte addieren Java Basics - Anfänger-Themen 13
java3690 Liste mit zufälligen zahlen füllen Java Basics - Anfänger-Themen 27
java3690 eine liste sortieren Java Basics - Anfänger-Themen 12
J Element aus Liste nehmen Java Basics - Anfänger-Themen 3
B JUnit 4: Wie man die eigene Liste testen kann [TDD] Java Basics - Anfänger-Themen 46
B Interface List - Objekt übergeben? Einzelnes Objekt geht, aber Liste nicht? Java Basics - Anfänger-Themen 4
P Was genau bringt mir es ein Array in eine Liste zu bringen Java Basics - Anfänger-Themen 3
A Doppelt verkettete Liste rückwärts ausgeben Java Basics - Anfänger-Themen 17
P Verschachtelte Array Liste Java Basics - Anfänger-Themen 2
H Liste speichern. Was lässt sich verbessern? Java Basics - Anfänger-Themen 7
P Performance Array und Liste Java Basics - Anfänger-Themen 13
M QuickSort und Liste Java Basics - Anfänger-Themen 6
N Methode um Objekte einer Liste hinzuzufügen Java Basics - Anfänger-Themen 1
B Summe von Property innerhalb einer Liste via Lambda Java Basics - Anfänger-Themen 1
V Collections int Werte in einer Liste sortieren Java Basics - Anfänger-Themen 23
B Neue Liste erstellen, wenn Objekte bestimmte Referenz hat / Gruppierung von Einträgen Java Basics - Anfänger-Themen 12
V_Fynn03 Beliebiges Element in einer Liste löschen (Java)(Lineare Datenstrukturen) Java Basics - Anfänger-Themen 9
L Baum aus Integer Liste erstellen Java Basics - Anfänger-Themen 0
CptK Koordinate in Liste suchen Java Basics - Anfänger-Themen 20
C Verschiedene Objekte in einer Liste speichern Java Basics - Anfänger-Themen 6
M Ausgabe einer Liste welche mehrere Stacks enthält Java Basics - Anfänger-Themen 3
D Doppelt Verkettete Zirkular-Liste Java Basics - Anfänger-Themen 1
L Liste in anderem Thread laden Java Basics - Anfänger-Themen 1
M Array liste Verdrehen Java Basics - Anfänger-Themen 8
A Verkettete Liste Java Basics - Anfänger-Themen 2
J Strings untereinander in einer Liste vergleichen Java Basics - Anfänger-Themen 18
B Liste von Tagen generieren ab einem bestimmten Datum und Endedatum Java Basics - Anfänger-Themen 4
S IndexOutOfBoundsException beim hinzufügen eines Elements zu einer Liste Java Basics - Anfänger-Themen 11
B Liste sortieren? Java Basics - Anfänger-Themen 4
O Anonyme Klasse einer Liste erstellen Java Basics - Anfänger-Themen 7
B SWAP List; Liste neu anordnen Java Basics - Anfänger-Themen 4
B CSS Klassen in eine Liste schreiben Java Basics - Anfänger-Themen 4
B Doppelt verkettete Liste implementieren Java Basics - Anfänger-Themen 8
L verkettete Liste Java Basics - Anfänger-Themen 15
scratchy1 doppelt verkettete Liste testen Java Basics - Anfänger-Themen 8
O ADT Liste z. B. Java Basics - Anfänger-Themen 15
B sortierte Liste Java Basics - Anfänger-Themen 4
O Knoten und Liste verarbeitung Java Basics - Anfänger-Themen 20
R Methoden Entferne alle identische Knoten (Typ String) aus verkettete Liste Java Basics - Anfänger-Themen 8
C Methoden Über eine einfach verkettete Liste Java Basics - Anfänger-Themen 8
J Eine Liste von Listen erstellen Java Basics - Anfänger-Themen 11

Ähnliche Java Themen

Neue Themen


Oben