2011-03-26 3 views
1

3 개의 중첩 된 TreeMaps 집합이 있습니다.중첩 된 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

+0

흠, 무슨 뜻인지 잘 모르겠지만 나무에서 '기록'을 구조화하는 방법을 보여 주겠다. [day, [court #, [time, name]]]. – melat0nin

+1

가능한 경우 입력 된 모음을 사용하십시오. 많은 키 스트로크를 저장하고 코드의 유형 안전성을 향상시킵니다. –

답변

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 (Mon, Tues, Wed 등), (Court 1, Court 2, Court 3 등) 및 (090009451030 등)의 각 키에 대한 반복 변수입니다. 문제는 부모 TreeMap에있는 단일 키와 관련된 값만 반복 할 수없는 것입니다. 귀하의 코드를 시도했지만 java.lang.Iterable의 인스턴스가 필요하다는 오류가 있습니다 - TreeMaps를 계산하지 마십시오? – melat0nin

+0

@melatOnin : Map 자체는 반복 할 수 없지만'values ​​()'(맵 값의 집합),'keySet' (키 집합) 및'entrySet()' 항목, 즉 키 - 값 - 쌍). 이 대답의 코드에서 각 루프에는'.entrySet()'이 추가되어야합니다. –

+0

내 대답을 편집했습니다. @ melat0nin : TreeMap에 대한 설명서 (http://download.oracle.com/javase/6/docs/api/)에서 오류를 발견하고 직접 해결책을 발견 할 수있었습니다. –