# java.util.LinkedList: Doppelte Elemente vermeiden



## Guest (18. Jun 2007)

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


----------



## Wildcard (18. Jun 2007)

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.


----------



## Guest (18. Jun 2007)

Danke! Also ruft Contains die equals-Methode meiner erstellten Klasse auf!? Das ist nett 

Und was hat das jetzt mit hashCode auf sich?


----------



## Wildcard (18. Jun 2007)

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.


----------



## Guest (18. Jun 2007)

Ok, so dachte ich mir das fast. Hab's meiner Meinung nach richtig so implementiert, aber funktionieren nenne ich was anderes:


```
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?


----------



## Wildcard (18. Jun 2007)

Überschreib equals(Object o) und caste entsprechend.


----------

