1

さて、HashSet を含むクラス (Vertex) があります。ある時点で、その要素をディープ コピーする必要があります。

コードを書きましたが、うまくいかないことがあります。私はこのバグに数日間取り組んでいますが、修正できません...コードを読んで見つけるのに十分な時間があれば、とても感謝しています。前もって感謝します。

さて、ここに機能があります:

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;
}

このメソッドを CopyFrom から CopyTo にコピーする必要があります。ここに私がこのメソッドを呼び出す方法があります:

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);

他のメソッド (.getNEighbours()、.addNeighbours() など) は正常に動作します。何百回もテストしました。

4

3 に答える 3

0

ソース頂点を結果の頂点にマッピングするためのより一貫した方法が必要です。createdハッシュセットではなく、ハッシュマップとして宣言します。の場合にのみ新しい頂点を作成します created.get(oldVertex)==null

于 2013-09-24T21:41:46.703 に答える