java.util.LinkedList: Doppelte Elemente vermeiden

  • Themenstarter Themenstarter Guest
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hallo zusammen!

Ich bin gerade dabei eine Adjazenzliste in Java zu implementieren und habe mir das folgend gedacht. Meine Hauptklasse Graph enthält eine verkettete Liste, in der jedes Element ein Startknoten ist, der wiederum eine verkettete Liste bestehend aus Endknoten enthält. Diese Knoten enthalten jeweils einen eindeutigen Bezeichner "name" und die Endknoten noch die Gewichtung der Kante zu ihnen.

Mein Problem an der Sache ist jetzt erstmal, dass ich doppelte Einträge vermeiden muss, d.h. beim Einfügen eines beliebigen Knoten muss überprüft werden, ob der Key schon vorhanden ist. Dazu wollte ich die Methode contains(Object o) verwenden, doch leider vergleicht diese ja nicht den Key, sondern wohl die Adresse des Objekts und die ist natürlich jedesmal verschieden.
Also überschreibe ich diese Methode bzw. schreib mir eine neue. Aber wie greife ich auf die intern geführte Liste zu, damit ich jedes Element durchgehen kann?
Oder hat jemand eine andere Idee, wie ich doppelte Elemente vermeiden kann?

Gruß,
Calex
 
Nein, du solltest nicht contains überschreiben, sondern die equals Methode der Objekte die du einfügen willst.
Vorsicht: wenn equals überschrieben wird muss auch hashCode überschrieben werden.
 
Danke! Also ruft Contains die equals-Methode meiner erstellten Klasse auf!? Das ist nett 😉

Und was hat das jetzt mit hashCode auf sich?
 
Der Kontrakt ist folgender:
wenn o1.equals(o2) true ergibt, dann muss auch o1.hasCode()==o2.hashCode() sein.
Wenn du also equals überschreibst musst du auch gewährleisten das der HashCode passt.
 
Ok, so dachte ich mir das fast. Hab's meiner Meinung nach richtig so implementiert, aber funktionieren nenne ich was anderes:

Code:
class Node
{
   String name;
   
   public Node(String name)
   {
      this.name = name;
   }
   
   public boolean equals(Node n)
   {
      if(n.name.equals(this.name)) return true;
      return false;
   }

   public boolean equals(String s)
   {
      if(s.equals(this.name)) return true;
      return false;
   }
   
   public int hashCode()
   {
      return this.name.hashCode();
   }
}

class Program
{
   public static void main(String[] args)
   {
      java.util.LinkedList<Node> l = new LinkedList();
      Node n = new Node("1");
      l.add(n);
      
      System.out.println(l.contains("1")); //ergibt false!!
   }
}

Wie schon geschrieben, wird mir immer false ausgegeben!

Was nun?
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben