2013-03-07 127 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

相關問題