1

次のように2つのクラスがあります。

public class State {
    private static long count = 0;
    private long StateNo;
    private Set<Arc> arcs;
}

public class Arc {
    private char charecter;
    private State destState;
    private Set<String> letters;
}

現在、クラス レキシコンには一連の状態があり、すべての状態には一連のアークがあります。私の質問は、セット状態の特定の状態でアークのセット内の特定のアークを更新する方法ですか? (その弧の文字のセットに文字を追加する必要があることを意味する更新。)

4

3 に答える 3

1

可変オブジェクトのセットがあります。

注意すべき問題の 1 つは、変更Arc.lettersが の結果に影響を与える可能性がある場合はArc.equals()、 を使用するときに注意する必要があることですSet<Arc>

ドキュメントから:

注: ミュータブル オブジェクトをセット要素として使用する場合は、細心の注意を払う必要があります。オブジェクトがセット内の要素であるときに、オブジェクトの値が equals 比較に影響を与える方法で変更された場合、セットの動作は指定されません。この禁止事項の特殊なケースは、集合がそれ自体を要素として含むことが許されないということです。

特に、これは、要素を から削除しState.arcs、変更してから、 に再挿入する必要があることを意味しますState.arcs

あなたの質問から、よりもを作成arcsしたほうがよいように思われます。1 つには、キーで物事を調べることができるようになりますが、これは現在できていないことです。MapSet

于 2013-03-07T10:37:31.437 に答える
0

このようなことを意味しますか?

public class Lexicon {
    class State {
        public long count = 0;
        public long stateNo;
        public Set<Arc> arcs;
    }

    class Arc {
        public char character;
        public State destState;
        public Set<String> letters;
    }

    Set<State> states = new HashSet<State>();

    public void update(long stateNo, char character, String letter) {
        for (State state : states) {
            if(state.stateNo == stateNo) {
                for (Arc arc : state.arcs) {
                    if (arc.character == character) {
                        arc.letters.add(letter);
                        break;
                    }
                }
                break;
            }
        }
    }
}

その場合は、マップ コレクションを使用して書き直したほうがよいでしょう。

public class Lexicon {
    class State {
        public long count = 0;
        public long stateNo;
        public Map<Character, Arc> arcs;

        public void updateArc(char character, String letter) {
            Arc arc = arcs.get(character);
            if (arc != null) {
                arc.letters.add(letter);
            }
        }
    }

    class Arc {
        public char character;
        public State destState;
        public Set<String> letters;
    }

    Map<Long, State> states = new HashMap<Long, State>();

    public void update(long stateNo, char character, String letter) {
        State state = states.get(stateNo);
        if (state != null) {
            state.updateArc(character, letter);
        }
    }
}

もちろん、これはドラフトのみであり、すべてのコレクションを初期化する必要があります。また、例をわかりやすくするために、すべてのフィールドが public として宣言されています。

于 2013-03-08T11:50:29.393 に答える
0

Set直接アクセス コレクションではありません。

キーでオブジェクトを直接取得できる s のHashMap代わりに使用する方が良いと思います。set

于 2013-03-07T10:35:27.813 に答える