Frage

Ich verwende einen rekursiven Baum von Hashmaps, insbesondere die Hashmap -Karte, bei der Objekt ein Hinweis auf eine andere Hashmap usw. ist. Dies wird um einen rekursiven Algorithmus weitergegeben:

foo(String filename, Hashmap<String, Object> map)
{
    //some stuff here
    for (Entry<String, Object> entry : map.entrySet()) 
    {
       //type warning that must be suppressed
       foo(entry.getKey(), (HashMap<String, Object>)entry.getValue());
    }
}

ich bin mir sicher Object ist vom Typ Hashmap<String, Object> bin aber irritiert, dass ich die Warnung mithilfe verwenden muss @SuppressWarnings("unchecked").

Ich werde mit einer Lösung zufrieden sein, die entweder a macht assert(/*entry.getValue() is of type HashMap<String, Object>*/) oder wirft eine Ausnahme aus, wenn es nicht ist. Ich habe die Generikensroute zur Kompilierung der Sicherheitstypsicherheit hinuntergegangen und wenn ich die Warnung unterdrücke, wird der Zweck besiegt.

Vielen Dank für Ihre Kommentare, KSB

War es hilfreich?

Lösung

Dies ist mit einer generischen Methode mit einer rekursiven Typvariablen möglich. Versuche Folgendes:

public <T extends Map<String, T>> void foo(String filename, T map) {
    //some stuff here
    for (Map.Entry<String, T> entry : map.entrySet())  {
        foo(entry.getKey(), entry.getValue());
    }
}

Sollte gut ohne Warnungen kompilieren.

Wenn Sie jedoch die Kontrolle über die Karte haben und Ihre eigene Klasse ersetzen können, ist es möglicherweise lesbarer, einen Klassenknoten zu erstellen (dies sieht für mich wie ein Baum aus), das, das enthält stattdessen eine Karte. Etwas wie:

public class Node {
    private Map<String, Node> children;

    ...
    // accessor methods to retrieve children ...
}

Und haben foo nimm a Node als zweites Argument stattdessen. Nur ein Vorschlag.

Andere Tipps

Sie können diese Klasse anstelle von HashMap verwenden:

public class RecursiveHashMap extends HashMap<String,RecursiveHashMap>
{
}

Ihre Datenstruktur sieht so aus, als ob Sie damit Bäume von Dateien (Dateinamen) darstellen möchten. Ich würde nicht empfehlen, dies mit HashMap als Knotentyp zu tun.

Ich würde vorschlagen, das zusammengesetzte Muster (siehe Wikipedia), vereinfachter Code zu verwenden:

abstract class Node
{
  String filename;
  Node( String filename ) { this.filename = filename; }
  abstract foo();
}

class FileNode implements Node
{
  FileNode( String filename ) { super(filename); }
  foo() { ... }
}

class DirectoryNode implements Node 
{
  Set<Node> children;
  DirectoryNode( String filename, Set<Node> children )
  {
    super(filename);
    this.children = children;
  }
  foo()
  {
    for ( Node child : children ) child.foo();
  }
}

Die HashMap, die Sie verwendet haben, läuft auf den in DirectoryNode erscheinen Set herab.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top