2013-09-24 3 views
1

Eh bien, j'ai une classe (Vertex), qui contient HashSet; et à un moment donné, j'ai besoin de copier profondément cet élément; J'ai écrit du code, mais parfois cela ne fonctionne pas; Je travaille sur ce bug depuis plusieurs jours et je ne peux pas le réparer ... Si quelqu'un a assez de temps pour lire le code et le trouver, je serai très reconnaissant. Merci d'avance.Java Graphique (Structure) Copie en profondeur

Eh bien, voici la fonction:

public Vertex getCopy(Vertex copyFrom, Vertex copyTo, HashSet<Vertex> created){ 

    copyTo.setId(copyFrom.getId()); 
    copyTo.setColor(copyFrom.getColor()); 
    copyTo.setCount(copyFrom.getCount()); 
    copyTo.setDepth(copyFrom.getDepth()); 
    copyTo.setDistance(copyFrom.getDistance()); 
    copyTo.setHeurist(copyFrom.getHeurist()); 
    copyTo.setVisited(copyFrom.isVisited()); 
    copyTo.setPath(copyFrom.getPath()); 

    created.add(copyTo); 

    HashSet<Vertex> copyToNeighs = new HashSet<Vertex>(); 
    HashSet<Vertex> copyFromNeighs = new HashSet<Vertex>(); 
    copyFromNeighs.addAll(copyFrom.getNeighbours()); 

    Iterator<Vertex> it = copyFromNeighs.iterator(); 

    while (it.hasNext()){ 
     Vertex curr = it.next(); 

     if (!created.contains(curr)){ 
      Vertex newOne = new Vertex(); 
      newOne = getCopy(curr, newOne, created); 
      copyToNeighs.add(newOne); 
     } else { 
      Iterator<Vertex> itr = created.iterator(); 
      while (itr.hasNext()){ 
       Vertex tmp = itr.next(); 
       if (tmp.equals(curr)){ 
        copyToNeighs.add(tmp); 
        break; 
       } 
      } 

     } 
    } 

    copyTo.setNeighbours(copyToNeighs); 

    return copyTo; 
} 

et je veux cette méthode pour copier de CopyFrom à CopyTo. Voici comment j'appelle cette méthode:

Vertex newOne = new Vertex(); 
Vertex newCurr = new Vertex(); 
HashSet<Vertex> seen1 = new HashSet<Vertex>(); 
HashSet<Vertex> seen2 = new HashSet<Vertex>(); 
newOne = newOne.getCopy(tmp, newOne, seen1); 
newCurr = newCurr.getCopy(curr, newCurr, seen2); 

autres méthodes (comme .getNEighbours(), .addNeighbours()) fonctionnent correctement, je les ai testé des centaines de fois;

+0

J'oubliais de dire que Vertex.id est toujours unique, donc j'ai overrided fonction de hachage de Vertex comme ça: –

+0

@Override hashCode public int() { \t \t retour this.id; \t} –

+0

voulez-vous copier un seul sommet ou le graphe entier? Et, que voulez-vous dire par "ne fonctionne pas"? –

Répondre

1

created est le mauvais concept. Vous avez un ensemble de nœuds dans le graphe "from", et vous créez un ensemble de nouveaux nœuds dans le graphe "to". created.add(copyTo) va ajouter un nouveau noeud, du graphe "to", à l'ensemble. Mais quand vous passez par created.iterator pour voir si un nœud est déjà là, vous cherchez un nœud de copyFromNeighs, qui est un nœud dans le "from" graphique. Il me semble que cela ne réussira jamais. Ou bien le résultat sera que vous aurez des nœuds dans le graphe "to" pointant vers des nœuds dans le graphe "from".

Fondamentalement, je crois que vous avez besoin created pour être un HashMap<Vertex,Vertex>, pas un ensemble. La "clé" du HashMap serait un nœud dans le graphe "from", et la "valeur" serait le nœud correspondant dans le graphe "to". Ensuite, lorsque vous regardez les voisins d'un nœud "de", vous obtenez le nœud "à" correspondant (s'il a déjà été copié) de la carte et l'ajoutez aux voisins de votre nœud "à" nouvellement créé.

0

vous avez besoin de manière plus cohérente à la carte sommets source sur les sommets résultants. Déclarez created comme hashmap, pas hashset. Créez un nouveau sommet uniquement lorsque created.get(oldVertex)==null.