2011-03-27 4 views
0

이것은 이전의 질문과 다소 관련이 있지만 문제의 초기에 중첩 문제를 해결해야한다는 것을 깨달았습니다. 그래서 여기에 있습니다. (나는 또한 Java의 초보자가되지 않으므로 나와 함께하시기 바랍니다.)중첩 된 TreeMaps는 어떻게 만듭니 까?

이름, 시간, 객실 번호 및 날짜가 소요될 5 개의 객실에 대한 간단한 예약 시스템을 만들고 있습니다. 이 작업은 중첩 된 TreeMaps를 사용하여 수행해야합니다. 여기 paretheses는 트리 맵의 경계를 나타냅니다 내가보기로 데이터의 배치는 다음과 같습니다

(일, (방 번호 (시간, 이름)))

최대한 멀리 볼 수, I 시간과 이름을 위해 하나의 TreeMap이 필요하다. 각 실마다 하나씩, 그리고 매일 하나씩. 이는 1 일당/시간 트리밍을 의미합니다. 이는 1 x 5 x 7 = 35 TreeMaps를 의미합니다. 이처럼 :

{Mon, [Room 1, (0600, NameA 
        0630, NameB 
        0700, NameC) 
     Room 2, (0600, NameD 
        0630, NameE) 
     Room 3, (0600, NameF 
        0630, NameG)] 
Tues, [Room 1, (0600, Name1 
        0630, Name2) 
     Room 2, (0600, Name3 
        0630, Name4 
        0700, Name5)]} 

, 내 옆에 문제가 모든 트리 맵을 생성하기 위해 루프를 통해 반복되는

그 결론에 도달 데 (다른 브래킷 유형은 중첩 된 트리 맵의 경계를 나타낸다). 내가 새로 만든 TreeMap의 이름에 카운터의 변수 번호를 지정할 수 없기 때문에 for 루프를 사용하여 TreeMaps를 동적으로 생성하는 것처럼 보이지 않습니다.

나는이 있었나요 :

TreeMap keyDay = new TreeMap(); 
TreeMap keyRoom = new TreeMap(); 
TreeMap keyTime = new TreeMap(); 

을하지만, 분명히 키의 중복을 허용하기에 충분하지 않은, 단지 세입니다 - 예를 들어,에 대한 새 항목을 '0900'(시간 키) 또는. '방 1'(방 키)는 이전 방을 덮어 씁니다.

누구에게 의견이 있습니까? 많이 주시면 감사하겠습니다 :)

+2

세상에서 TreeMaps를 너무 좋아하는 이유는 무엇입니까? 신청서가 너무 늦지 않을 때까지 재 설계해야합니다. 트리플 중첩 된 TreeMap 그냥 나쁜 것입니다. 그것은 정말로, 정말로 나쁨이다.더 나은 해결책을 찾을 수있을 것이라고 확신합니다. – xappymah

+0

당신은 이것을 위해 데이터베이스를 사용하고 싶습니다. –

+0

옵션이 없습니다. 두렵습니다. – melat0nin

답변

2

나는 그것이 매우 메가 나쁜 것은 매우 동의합니다. 그러나이 기능을 구현하려면 대신 HashMaps를 사용하는 것이 좋습니다.

public class Reservations { 

static final int DAY_SUN = 0, DAY_MON = 1, DAY_TUE = 2, DAY_WED = 3, DAY_THU = 4, DAY_FRI = 5, DAY_SAT = 6; 
static final int ROOM_1 = 0, ROOM_2 = 1, ROOM_3 = 2, ROOM_4 = 3, ROOM_5 = 4; 
private static HashMap<Integer[], String[]> hMap = new HashMap<Integer[], String[]>(); 


static String [] getStringForValue(Integer[] i){ 
    return hMap.get(i); 
} 

static TreeSet<String> getOrderedOutputStrings(){ 
    TreeSet<String> set = new TreeSet<String>(); 
    for(Entry<Integer[],String[]> e : hMap.entrySet()){ 
     int day_int = Reservations.getDay(e.getKey()); 
     int room_int = Reservations.getRoom(e.getKey()); 
     int time = Reservations.getTime(e.getValue()); 
     String name = Reservations.getGuestName(e.getValue()); 
     String day = Reservations.dayToString(day_int); 
     String room = Reservations.roomToString(room_int); 
     if(time > 0) 
     set.add("DAY: " + "(" + day_int + ")" + day + " (" + room_int + ")"+ "ROOM: " + room + " :: " + name + " @ " + time); 
    } 
    return set; 
} 



static void setupMap() { 
    for (int day = 0; day < 7; day++) { 
     for (int room = 0; room < 5; room++) { 
      addGuest(day, room, (int)(Math.random()*1000), "Bob TestCase"); 
     } 
    } 
} 

static void addGuest(int day, int room, int time, String name) { 
    Integer[] ref = new Integer[2]; 
    ref[0] = day; 
    ref[1] = room; 
    String[] s = new String[2]; 
    s[0] = Integer.toString(time); 
    s[1] = name; 
    hMap.put(ref, s); 
} 

static String[] lookupRoom(int day, int room) { 
    Integer[] i = new Integer[2]; 
    i[0] = day; 
    i[1] = room; 
    return hMap.get(i); 
} 

static int getDay(Integer[] i){ 
    return i[0]; 
} 

static int getRoom(Integer[] i){ 
    return i[1]; 
} 

static int getTime(String[] s) { 
    return Integer.parseInt(s[0]); 
} 

public static String getGuestName(String[] s) { 
    return s[1]; 
} 

public static String dayToString(int i){ 
    switch(i){ 
     case 0: 
      return "SUNDAY"; 
     case 1: 
      return "MONDAY"; 
     case 2: 
      return "TUESDAY"; 
     case 3: 
      return "WEDNESDAY"; 
     case 4: 
      return "THURSDAY"; 
     case 5: 
      return "FRIDAY"; 
     case 6: 
      return "SATURDAY"; 
     default: 
      return null; 
    } 
} 

public static String roomToString(int i){ 
    switch(i){ 
     case 0: 
      return "ROOM ONE"; 
     case 1: 
      return "ROOM TWO"; 
     case 2: 
      return "ROOM THREE"; 
     case 3: 
      return "ROOM FOUR"; 
     case 4: 
      return "ROOM FIVE"; 
     default: 
      return null; 
    } 
} 

}

가 여기에 예약 클래스 실행이 메인입니다 : 여기 당신이 원하는 기능을 구현하는 클래스입니다

public class Main { 

/** 
* @param args the command line arguments 
*/ 
public static void main(String[] args) { 
    Reservations.setupMap(); //Run to test TODO: remove setupMap() from Reservation class 
    Reservations.addGuest(Reservations.DAY_MON, Reservations.ROOM_2, 1230, "John Doe"); 

    TreeSet<String> set = new TreeSet<String>(); 
    for(String s: Reservations.getOrderedOutputStrings()){ 
     System.out.println(s + "\n"); 
    } 


} 
} 

그리고 마지막으로, 사용 SetupMap 및 단일 항목, 다음을 생성합니다.

DAY: (0)SUNDAY (0)ROOM: ROOM ONE :: Bob TestCase @ 423 

DAY: (0)SUNDAY (1)ROOM: ROOM TWO :: Bob TestCase @ 637 

DAY: (0)SUNDAY (2)ROOM: ROOM THREE :: Bob TestCase @ 731 

DAY: (0)SUNDAY (3)ROOM: ROOM FOUR :: Bob TestCase @ 424 

DAY: (0)SUNDAY (4)ROOM: ROOM FIVE :: Bob TestCase @ 427 

DAY: (1)MONDAY (0)ROOM: ROOM ONE :: Bob TestCase @ 335 

DAY: (1)MONDAY (1)ROOM: ROOM TWO :: Bob TestCase @ 580 

DAY: (1)MONDAY (1)ROOM: ROOM TWO :: John Doe @ 1230 

DAY: (1)MONDAY (2)ROOM: ROOM THREE :: Bob TestCase @ 700 

DAY: (1)MONDAY (3)ROOM: ROOM FOUR :: Bob TestCase @ 556 

DAY: (1)MONDAY (4)ROOM: ROOM FIVE :: Bob TestCase @ 92 

DAY: (2)TUESDAY (0)ROOM: ROOM ONE :: Bob TestCase @ 84 

DAY: (2)TUESDAY (1)ROOM: ROOM TWO :: Bob TestCase @ 964 

DAY: (2)TUESDAY (2)ROOM: ROOM THREE :: Bob TestCase @ 981 

DAY: (2)TUESDAY (3)ROOM: ROOM FOUR :: Bob TestCase @ 294 

DAY: (2)TUESDAY (4)ROOM: ROOM FIVE :: Bob TestCase @ 22 

DAY: (3)WEDNESDAY (0)ROOM: ROOM ONE :: Bob TestCase @ 216 

DAY: (3)WEDNESDAY (1)ROOM: ROOM TWO :: Bob TestCase @ 838 

DAY: (3)WEDNESDAY (2)ROOM: ROOM THREE :: Bob TestCase @ 198 

DAY: (3)WEDNESDAY (3)ROOM: ROOM FOUR :: Bob TestCase @ 494 

DAY: (3)WEDNESDAY (4)ROOM: ROOM FIVE :: Bob TestCase @ 796 

DAY: (4)THURSDAY (0)ROOM: ROOM ONE :: Bob TestCase @ 617 

DAY: (4)THURSDAY (1)ROOM: ROOM TWO :: Bob TestCase @ 866 

DAY: (4)THURSDAY (2)ROOM: ROOM THREE :: Bob TestCase @ 799 

DAY: (4)THURSDAY (3)ROOM: ROOM FOUR :: Bob TestCase @ 242 

DAY: (4)THURSDAY (4)ROOM: ROOM FIVE :: Bob TestCase @ 178 

DAY: (5)FRIDAY (0)ROOM: ROOM ONE :: Bob TestCase @ 491 

DAY: (5)FRIDAY (1)ROOM: ROOM TWO :: Bob TestCase @ 16 

DAY: (5)FRIDAY (2)ROOM: ROOM THREE :: Bob TestCase @ 838 

DAY: (5)FRIDAY (3)ROOM: ROOM FOUR :: Bob TestCase @ 63 

DAY: (5)FRIDAY (4)ROOM: ROOM FIVE :: Bob TestCase @ 860 

DAY: (6)SATURDAY (0)ROOM: ROOM ONE :: Bob TestCase @ 73 

DAY: (6)SATURDAY (1)ROOM: ROOM TWO :: Bob TestCase @ 759 

DAY: (6)SATURDAY (2)ROOM: ROOM THREE :: Bob TestCase @ 15 

DAY: (6)SATURDAY (3)ROOM: ROOM FOUR :: Bob TestCase @ 115 

DAY: (6)SATURDAY (4)ROOM: ROOM FIVE :: Bob TestCase @ 21 

결과가 1 초 이내에 생성되었습니다. 중첩 된 TreeMaps보다 무한히 효율적이라고 약속합니다. 행운을 빕니다!

+0

문제의 분석을 위해, Tree- 또는 Hashmap이 사용되는지 여부는 전적으로 무관합니다. 문제는지도가 적절한 지 아닌지에 따라 다르며, 그렇다면지도가 서로 내부에 중첩되어야하는지 여부입니다. – Ingo

+0

나는 정말로 당신이 그 질문에 결코 대답하지 않았 음에 동의하지만, 나는 당신에게 노력과 여분의 일로 +1을 주려고합니다. – bconneen

+0

나는 bconneen에 동의한다 - 나는 당신의 코드를 사용할 수 없다. 그러나 그것을 쓸 시간을 가져 주셔서 감사한다! – melat0nin

0

하나는 일이 실제로 열거이라고 가정 것이다, 그래서 최고 수준의지도 오히려

Map<Day, Map<String, Map<Integer, String>>> bookings = new EnumMap<Day, Map<String, Map<Integer, String>>>(Day.class); 
0

별로 대답,하지만 생각 EnumMap는해야한다)

실제로 xappymah가 주석에서 지적한 것처럼,보다 자연스러운 접근 방식은 작업에 대한 도메인 별 유형을 고안하는 것입니다. 좋아요 :

interface Room { 
    String getName(); 
    public void bookRoom(Booking booking) throws AlreadyBookedException; 
} 

interface Person { 
    String getName(); 
} 

class Interval { 
    Date startTime; 
    long duration; 
} 

interface Booking { 
    Interval getInterval(); 
    Room getBookedRoom() throws NotBookedYetException; 
    Set<Person> getParticipants(); 
} 

interface BookingUtils { 
    Set<Booking> getBookingsForInterval(Interval interval); 
    Set<Booking> getBookingsOfRoom(Room room); 
} 
+0

아아, TreeMaps를 사용해야합니다. 이것은 대학 운동을위한 것입니다 :/ – melat0nin

관련 문제