2013-03-07 83 views
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; 
} 

如今类词汇已设置状态,反过来每个国家都有一套弧线。我的问题是如何更新设置状态下特定状态的弧组中的特定弧? (更新意思我需要给该弧段中的一组字母添加一个字母。)

+0

你有没有参考你需要更新的状态? – 2013-03-07 10:36:24

+0

stateno可以识别正确的状态,count是保持stateNo不唯一的静态变量。 – 2013-03-07 10:57:27

+0

在这种情况下,我同意推荐使用Map的答案。更具体地说,你应该有一个地图,你可以使用它来找到一个状态给定其状态。同样,你需要决定如何找到你想改变的弧,给定一个国家。 – 2013-03-07 11:01:21

回答

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

当然这只是草案,你摇头初始化所有集合。 也为了清晰起见,所有字段都声明为公开。

+0

这很有帮助,非常感谢你 – 2013-03-08 23:36:48

0

Set不是直接访问集合。

我认为您最好使用HashMap而不是那些set s,您可以直接通过键获取对象。

+0

我将如何将Arc存储在地图中,我的意思是,什么是关键和价值?它如何帮助访问元素?我是否必须将地图存储在地图中以及Lexicon类中? – 2013-03-07 11:02:27

+0

您可以添加关键属性并使其唯一。如果您需要以这种方式访问​​集合中的对象,则应使用Map并查看如何调整代码。你如何识别更新哪个弧和状态? – BobTheBuilder 2013-03-07 11:58:51

+0

如果你注意到,State类有一个stateNo作为一个变量,它将帮助找到唯一的状态。 State类中的count变量是静态的并且处理唯一的stateNo。弧由单个字符串表示。每个州将在a-z之间具有独特的字符串。我实际上是通过使用GADDAG算法来构建用于拼字游戏的词典。该算法用伪代码在这里解释http://www.ericsink.com/downloads/faster-scrabble-gordon.pdf – 2013-03-07 13:45:12

1

您有一组可变对象。

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

documentation

注意:如果使用可变对象作为一组元素大,一定要小心。如果对象的值以影响等于比较的方式更改,而对象是集合中的元素,则不会指定集的行为。这种禁令的一个特例是,一个集合不允许自己作为一个元素。

具体而言,这意味着你必须从State.arcs删除元素,修改它,然后将其重新插入State.arcs

从你的问题看来,你最好是使arcs a Map而不是Set。首先,你可以通过密钥来查找事物,这是你目前无法做到的。

+0

我如何将Arc存储在地图中,我的意思是,什么是关键和价值?它如何帮助访问元素?我是否必须将地图存储在地图中以及Lexicon类中? – 2013-03-07 11:02:05

相关问题