1

我有两个类如下:

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

现在 Class Lexicon 有一组状态,每个状态又都有一组弧。我的问题是如何更新集合状态中特定状态的弧集中的特定弧?(更新意味着我需要在该弧中的字母集中添加一个字母。)

4

3 回答 3

1

您有一组可变对象。

需要注意的一个问题是,如果更改Arc.letters会影响 的结果Arc.equals(),则在使用 时必须小心Set<Arc>

文档中:

注意:如果将可变对象用作集合元素,则必须非常小心。如果对象的值以影响等于比较的方式更改,而对象是集合中的一个元素,则不指定集合的​​行为。此禁令的一个特殊情况是不允许集合包含自身作为元素。

特别是,这意味着您必须从 中删除元素State.arcs,对其进行修改,然后将其重新插入State.arcs

从您的问题来看,您最好制作arcsaMap而不是 a Set。一方面,您可以通过键查找内容,这是您目前无法做到的。

于 2013-03-07T10:37:31.437 回答
0

Set不是直接访问集合。

我认为你最好使用HashMap而不是那些set你可以直接按键获取对象的s。

于 2013-03-07T10:35:27.813 回答
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);
        }
    }
}

Of course this is draft only and you heave to initialize all collections. Also all fields are declared as public only for clarity of example.

于 2013-03-08T11:50:29.393 回答