Announcement

Collapse
No announcement yet.

TreeMap findet Schlüssel nicht

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • TreeMap findet Schlüssel nicht

    Hallo zusammen.

    Ich habe ein Treeset, füge Daten + Schlüssel hinein, aber ich kann den erwartenden Datensatz nicht finden

    Zuerst die Klasse für den Treesetschlüssel (nein, das ist kein PHP Code ) :

    PHP Code:
        public static void createFolderTreeView(String attributNameUser userHttpServletRequest requestthrows KnowledgebaseException
        
    {

            
    /** Klasse, die nur in der Funktion createFolderTreeView verwendet wird.
                Sie dient der Sortierung der angezeigten Ordner.
             */
            
    class Key implements Comparable
            
    {
                
    int id;
                
    String name;

                public 
    Key(int idString name)
                {
                    
    this.id id;
                    
    this.name name;
                }

                @
    Override
                
    public String toString()
                {
                    return 
    this.name ": " this.id;
                }

                @
    Override
                
    public int compareTo(Object o)
                {
                    
    Key otherKey = (Keyo;

                    
    // Solange die Knoten unterschiedliche IDs besitzen, wird nach deren Benennung sortiert
                    // System.out.println(name + " " + id + "<-->" + otherKey.name + " " + otherKey.id);

                    
    if (otherKey.id != this.id)
                    {
                        if (
    name.compareTo(otherKey.name) != 0
                            return 
    name.compareTo(otherKey.name);
                        else 
                            return 
    1;
                    }
                    else
                        return 
    0;
                }

                @
    Override
                
    public boolean equals(Object o)
                {
                    if (
    this.getClass() != o.getClass())return false;

                    
    Key otherKey = (Keyo;

                    if (
    otherKey.id != this.id) return false;
                    else return 
    true;
                }
                
                @
    Override
                
    public int hashCode()
                {
                    return 
    this.id;
                }
                    
            } 

    Mein Hauptanliegen betrifft aber das Treeset selbst. Nachfolgend habe ich die Fehlerbeschreibung als Kommentar in den Codeauszug geschrieben
    PHP Code:
                 // Hier lese ich alle Schlüssel aus:        
                 
    Iterator <KeykeyIds allNodes.keySet().iterator();

                
    // Alle Schlüssel durchlaufen      
                
    while (keyIds.hasNext())
                {
                    
    Key key keyIds.next();
                    
    // Hier ist das eigenliche Problem, Die Variable n ist NULL, weil keine übereinstimmenden Schlüssel gefunden werden, obwohl ich die Schlüsselmenge durchiteriere und einen Schlüssel aus der Iterationsmenge in der Iterationsmenge suche
                    
    TreeNode n allNodes.get(key);

    // containsKey gibt hier false zurück, der angegebene Schlüssel ist also nicht im Treeset vorhanden
                    
    System.out.println(allNodes.containsKey(key));

    // Wenn ich mir aber den Spass mache, alle Schlüssel nochmals durchzuiterieren und dann mit dem Schlüssel vergleiche, dann liefert equals true und compareTo 0 zurück.
                    
    Iterator <Keyitr allNodes.keySet().iterator();

                    while (
    itr.hasNext())
                    {
                        
    Key kk itr.next();
                        
    System.out.println(kk " <--> " key " .... " kk.equals(key) + " .... " kk.compareTo(key));

                    } 

    Edit: Liebe Admins: Bitte in richtiges Forum verschieben

  • #2
    // Hier ist das eigenliche Problem, Die Variable n ist NULL, weil keine übereinstimmenden Schlüssel gefunden werden, obwohl ich die Schlüsselmenge durchiteriere und einen Schlüssel aus der Iterationsmenge in der Iterationsmenge suche
    TreeNode n = allNodes.get(key);
    Wo ist da ein Vergleich? hier wird n doch lediglich der aktuelle Key aus der Iteration zugewiesen.
    Christian

    Comment


    • #3
      Originally posted by Christian Marquardt View Post
      Wo ist da ein Vergleich? hier wird n doch lediglich der aktuelle Key aus der Iteration zugewiesen.
      Der Vergleich ist implizit .get() mit nur ein Objekt zurück liefert, wenn die Schlüssel übereinstimmen

      Comment


      • #4
        Der Vergleich ist implizit .get() mit nur ein Objekt zurück liefert, wenn die Schlüssel übereinstimmen
        ???

        Sehe ich anders

        Mit
        while (keyIds.hasNext())

        iterrierst du über die Map


        Mit

        Key key = keyIds.next();

        holst du dir den aktuellen Key der nach der Iteration gerade dran ist.


        Mit

        TreeNode n = allNodes.get(key);

        wird aus der Map das Objekt geholt, welches dem Key entspricht.

        Wo ist da der Vergleich? Warum sollte das nun nicht in der Map sein?

        Wie ist die Map deklariert? Ist das Objekt zu diesem Key null?

        Was ergibt containsKey?

        Was ergibt (aus Java ist eine Insel):

        Während keySet() nur die eindeutigen Schlüssel in einer Menge liefert, gibt entrySet() eine Menge von Objekten vom Typ Map.Entry zurück. Entry ist eine innere Schnittstelle in der Schnittstelle Map, welches Schlüssel-Werte-Paare speichert. Die wichtigen Funktionen dieser Schnittstelle sind getKey(), getValue() und setValue(), wobei die letzte Funktion von HashMap angeboten wird, aber eine optionale Funktion ist.

        Beispiel Laufe die Elemente HashMap als Menge von Map.Entry-Objekten ab.
        for
        ( Map.Entry<String, String> e : h.entrySet() )
        System.out.println( e.getKey() + "="+ e.getValue() );
        Zuletzt editiert von Christian Marquardt; 09.11.2010, 09:06.
        Christian

        Comment


        • #5
          Map vielleicht leer?

          Hallo MarkusLe,

          das Problem entsteht, weil die equals und die compareTo Methode Deiner Key-Klasse inkonsistent sind. D.h. equals() vergleicht nur die ids, compareTo() vergleicht zusätzlich die Namen. Soetwas führt im Zusammenhang mit den Treebasierten Implementierungen von Set oder Map zu sehr merkwürdigen Effekten. Siehe auch die API-Doku von Comparable: http://download.oracle.com/javase/1....omparable.html

          Klassen, bei denen compareTo und equals inkonsistent sind, sind für die Verwendung in sortierten Collections nicht geeignet. Man sollte eine inkonsistente compareTo Methode deswegen auch im JavaDoc kenntlich machen mit <em>Inkonsistent with equals()!</em>

          Gruß ngomo
          Zuletzt editiert von ngomo; 16.11.2010, 18:46.
          http://www.winfonet.eu

          Comment

          Working...
          X