2012-09-25 88 views
0

編輯:我應該提到我對Java編程極其新穎。大約兩週前我剛開始使用該語言。防止在碰撞時合併樹圖

我試圖尋找一個答案,這個問題,但到目前爲止,我還沒有找到一個所以這就是爲什麼我問這裏。

我編寫Java代碼爲龍與地下城倡議跟蹤器,我使用一個TreeMap對其進行排序對進入的能力。我對Java仍然很陌生,所以我不知道那裏的一切。

我的問題是,當我有兩個相同的密鑰,樹合併的值,使得值中的一個不再存在。我知道這可能是理想的行爲,但在我的情況下,我不能這樣做。我希望能有一個優雅的解決方案來解決這個問題。到目前爲止,我擁有的是:

TreeMap<Integer,Character> initiativeList = new TreeMap<Integer,Character>(Collections.reverseOrder()); 
    Character [] cHolder = new Character[3]; 

    out.println("Thank you for using the Initiative Tracker Project."); 

    cHolder[0] = new Character("Fred",2); 
    cHolder[1] = new Character("Sam",3,23); 
    cHolder[2] = new Character("John",2,23); 

    for(int i = 0; i < cHolder.length; ++i) 
    {   
    initiativeList.put(cHolder[i].getInitValue(), cHolder[i]); 
    } 

    out.println("Initiative List: " + initiativeList); 

字符是我定義的一個類,用於跟蹤玩家的角色名稱和主動值。

目前的輸出是這樣的:

Initiative List: {23=John, 3=Fred} 

我認爲使用了某種子集合的一個TreeMap,但我也碰到了類似的問題。我真正需要做的只是找到一種方法來禁用合併。謝謝你們給我的任何幫助。

編輯:在龍與地下城,字符輥20面的骰子中,然後加入他們的主動模的結果來獲得它們的總倡議。有時候兩個玩家可以獲得相同的價值。我想過有格式如下鍵值:

Key = InitiativeValue.InitiativeMod 

所以山姆他的關鍵是23.3和約翰將23.2。我知道我需要將鍵類型更改爲float而不是int。

然而,即使有兩個球員可能具有相同的倡議國防部和推出同樣計劃價值。事實上,這發生得比你想象的要多。例如,

說彼得和斯科特加入遊戲。他們都有2的主動調整值,並且他們在20個骰子上擲出10。這將使雙方的主觀能動性值12

當我把它們放到現有的地圖,他們都需要顯示出來,即使它們具有相同的值。

Initiative List: {23=John, 12=Peter, 12=Scott, 3=Fred} 

我希望幫助澄清什麼,我需要。

+1

你想要發生什麼?你會碰到幾個multimap實現的問題? –

+0

如果你想讓他們成爲一個集合,你不能讓他們擁有相同的密鑰。我會建議使用Character類的一些獨特的東西作爲密鑰 – gtgaxiola

+0

Ditto存儲到Dave,但也向我們展示了導致問題的案例的樣本輸入和期望結果。 – Bohemian

回答

2

如果我正確理解你,你有一堆角色和他們的主動權,並且想要通過主動ID將該結構「反轉」爲關鍵字,其值爲具有該主動權的所有角色。這完全可以通過MultiMap數據結構捕獲,其中一個實現是Guava TreeMultimap

沒有什麼不可思議的。你可以實現一個

TreeMap<Initiative,List<Character>> 

類似的東西這不正是一個番石榴多重映射是如何實現的,但它是最簡單的數據結構,能夠支持你所需要的。

如果我這樣做,我會寫我自己的類,包裝上述TreeMap,並提供了一個add(K key, V value)方法,根據您的具體要求處理重複檢測和列表管理。

+0

a)認爲'TreeMultimap'與'TreeMap >'產生了很多混淆的可能性,例如,在空的名單上。 b)即使它是'TreeMultimap'將是一個'TreeMap >'。您希望使用'Multimaps.newListMultimap'來獲得'Map'和值集合實現的自定義組合。 –

+0

是的,你是對的。我已經重新回答了我的答案。 –

0

你說你是「......一個TreeMap它的排序能力...」 - 但也許你可以只使用TreeSet來代替。您需要在您的Character類上實施合適的compareTo方法,以執行所需的比較;我強烈建議您也實施hashCodeequals

然後,當您遍歷TreeSet時,將以適當的順序獲取Character對象。請注意,Map類僅用於查找目的,而不用於排序。