如何更新另一个Set中的set中的元素?

时间:2013-03-07 10:33:07

标签: java

我有两个课程如下:

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有一组状态,每个状态又有一组弧。我的问题是如何在设置状态下更新特定状态的弧集中的特定弧? (更新意思是我需要在该弧中的字母集中添加一个字母。)

3 个答案:

答案 0 :(得分:1)

你有一组可变对象。

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

来自documentation

  

注意:如果将可变对象用作set元素,则必须非常小心。如果在对象是集合中的元素的同时以影响等于比较的方式更改对象的值,则不指定集合的​​行为。这种禁止的一个特例是,不允许集合将自己作为一个元素包含在内。

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

从您的问题来看,您最好不要arcs Map而不是Set。首先,你可以用钥匙查找东西,这是你目前无法做到的。

答案 1 :(得分:0)

Set不是直接访问集合。

我认为最好使用HashMap代替那些set,您可以直接通过密钥获取对象。

答案 2 :(得分: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);
        }
    }
}

当然这只是草稿,你可以重新初始化所有收藏品。 此外,为了清楚起见,所有字段都被声明为公共字段。