2013-07-11 14 views
0

不尋找任何代碼的幫助,只是一些建議。像Collections.rotate的地圖

我正在設計一個調度程序,它爲所有團隊提供文本文件輸入並安排每週遊戲。我有這個工作,現在我正在擴大它,以保持結果。目前我將所有隊伍列入清單。並使用Collections.rotate旋轉列表以隨機化燈具。

我正在考慮使用Map來保存團隊和勝數,但旋轉對於地圖來說似乎不起作用。有沒有類似的功能,我錯過了,或者我忽略了什麼?

+1

如何添加場勝利,併爲你的團隊課程安排者和獲得者?這樣,您仍然可以將它保存在列表中,並像以前一樣使用Collections.rotate。查找不是O(1)像地圖,但有一個不應該成爲問題的團隊列表,幾個元素。 – arynaq

回答

3

你不想旋轉地圖本身,但它聽起來像你想要做的是旋轉地圖的的視圖。

因此,在僞代碼,你可以不喜歡

//make a copy of the keys of the map 
List keys = new ArrayList(yourmap.keys()) 
Collections.rotate(keys) 
//iterate over the keys of the map in the new rotated order 
for key in keys: 
    Object value = yourmap.get(key) 
    // do something with this value 
+1

您需要確保地圖鍵按照所需的順序開始。 – assylias

+0

是正確的,儘管原始問題提到「使用Collections.rotate來旋轉列表*以隨機化* fixtures」,這看起來有點不正確 - 它不是真正的隨機 - 'Collections.shuffle()'聽起來更合適。 –

+0

事實上 - 不確定OP是否想要隨機化或旋轉。 – assylias

2

主要有3個,非專業的Map接口在JDK的實現:

  • HashMap未下令 - 這是不會幫你
  • TreeMap這是基於有序一些比較 - 恐怕不是容易適應你的使用情況
  • LinkedHashMap這由插入命令或訪問順序排序

對於您的情況,您可以使用LinkedHashMap使用訪問訂單(您創建一個與a special construtor with the parameter accessOrder set to true),並且每次訪問其中一個項目時,它將自動重新排序到地圖的尾部。完整的迭代週期將保持訂單不變。

+0

「...每次訪問其中一個項目時,它將自動重新排序到地圖尾部。」訪問不會移動任何東西,除非您使用特殊構造函數實例化它,並且默認情況下,所有其他構造函數都會生成地圖插入順序。 – Brian

+0

@Brian我特別提到*'LinkedHashMap'使用**訪問順序***,它是用您鏈接的構造函數創建的。 – assylias

+0

我的意思是,如何創建它並不明顯,就這些。由於某些原因,鏈接不能使用'[]()',所以這裏是:http://docs.oracle.com/javase/6/docs/api/java/util/LinkedHashMap.html#LinkedHashMap (int,%20float,%20boolean) – Brian

2

旋轉可能與LinkedHashMap的工作,這是怎樣的一個元素旋轉地圖

Iterator<Entry> i = m.entrySet().iterator(); 
Entry e = i.next(); 
i.remove(); 
m.put(e.getKey(), e.getValue());