2011-03-26 85 views
1

我有一組3個嵌套的樹狀圖:如何迭代嵌套TreeMaps?

TreeMap<DayOfWeek, TreeMap<Court, TreeMap<Time, String>>> keyDay = new TreeMap<DayOfWeek, TreeMap<Court, TreeMap<Time, String>>>(); 
TreeMap<Court, TreeMap<Time, String>> keyCourt = new TreeMap<Court, TreeMap<Time, String>>(); 
TreeMap<Time, String> keyTime = new TreeMap<Time, String>(); 

其中存儲預訂信息。我試圖通過使用嵌套while循環遍歷它們來顯示所有已創建的預訂,但是我需要一種嵌套whiles的方式來顯示與相關父級相關的值。

這是我有:

 Iterator listOfDays = keyDay.keySet().iterator(); 
    Iterator listOfCourts = keyCourt.keySet().iterator(); 
    Iterator listOfTimes = keyTime.keySet().iterator(); 
    String output; 

    while (listOfDays.hasNext()) { 
     DayOfWeek currentDay = (DayOfWeek) (listOfDays.next()); 
     output += currentDay.toString() + "\n----------\n"; 
     while (listOfCourts.hasNext()){ 
      Court currentCourt = (Court) (listOfCourts.next()); 
      output += currentCourt.toString() + ":\n"; 
      while (listOfTimes.hasNext()){ 
       Time currentTime = (Time) (listOfTimes.next()); 
       String currentName = (String) keyTime.get(currentTime); 
       output += currentTime.toString() + " - " + currentName + "\n"; 
      } 
     } 

...但預期(但不想要的),它只是通過每個TreeMap中直到結束所有條目進行迭代。

任何人都可以幫忙嗎?

+0

這裏有什麼令人困惑的是,你說的是嵌套樹,事實上keyDay是嵌套的,但是你不會觸摸嵌套樹,而是通過無關樹。 – Ingo 2011-03-26 18:33:52

+0

嗯,我不確定你的意思,但讓我給你一個例子,說明我如何在樹上構建'記錄':[day,[court#,[time,name]]]。 – melat0nin 2011-03-26 18:38:19

+1

如果可以,請使用鍵入的集合。您將節省大量擊鍵次數並提高代碼的類型安全性。 – 2011-03-26 18:38:25

回答

3

這不是很清楚(是什麼listOfDays,listOfCourts和listOfTimes?),但我想你需要的東西是這樣的:

for (Map.Entry<DayOfWeek, TreeMap<Court, TreeMap<Time, String>>> dayEntry : keyDay.entrySet()) { 
    DayOfWeek currentDay = dayEntry.getKey(); 
    output += currentDay.toString() + "\n----------\n"; 
    for (Map.Entry<Court, TreeMap<Time, String>> courtEntry : dayEntry.getValue().entrySet()) { 
     Court currentCourt = courtEntry.getKey(); 
     output += currentCourt.toString() + ":\n"; 
     for (Map.Entry<Time, String> timeEntry : currentCourt.getValue().entrySet()) { 
      Time currentTime = timeEntry.getKey(); 
      String currentName = timeEntry.getValue(); 
      output += currentTime.toString() + " - " + currentName + "\n"; 
     } 
    } 
} 

總之,地圖可以被看作是一組地圖項,你可以遍歷這個入口集。每個條目都有一個鍵和一個值。由於在您的情況下,值是另一個地圖,您可以重複此操作的值。

+0

感謝您的回答。 listOfDays,listOfCourts和listOfTimes只是每個TreeMaps(週一,週二,週三等),(法院1,法院2,法院3等)和(0900,0945,1030等)中的密鑰的迭代變量。問題是我似乎無法迭代與父TreeMap中的單個鍵有關的值。我試過你的代碼,但得到有關需要java.lang.Iterable的實例的錯誤 - TreeMaps不算數? – melat0nin 2011-03-26 22:05:16

+0

@melatOnin:Map本身不是可迭代的,但它有三個方法'values()'(地圖值的集合),'keySet'(鍵的集合)和'entrySet()'條目,即鍵值對)。在這個答案的代碼中,應該在每個循環中添加'.entrySet()'。 – 2011-03-27 01:20:06

+0

我編輯了我的答案。 @ melat0nin:您可能發現了錯誤,並通過查看TreeMap的文檔找到了解決方案:http://download.oracle.com/javase/6/docs/api/。 – 2011-03-27 19:59:28