중첩 된 TreeMaps를 어떻게 만드는가?
문제
이것은 이전의 질문과 다소 관련이 있지만 문제가 일찍 중첩 된 문제를 다룰 필요가 있음을 깨달았습니다. (나는 또한 Java의 초보자가 멀지 않아서 나와 함께 곰주세요.
이름, 시간, 룸 번호 및 일을 할 수있는 5 개의 객실을위한 간단한 예약 시스템을 만드고 있습니다. 이것은 중첩 된 TREEEMAPS를 사용하여 수행되어야합니다. 여기에 Pertheses가 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)]}
.
(다른 브래킷 유형은 중첩 된 TREEEMAPS의 경계를 나타냄
결론이 나오면 다음 문제가 모든 TREEMAPS를 생성하기 위해 루프를 통해 반복됩니다. 새로 작성된 TreeEreeMap의 이름에 카운터의 변수 번호를 집어 넣을 수 없기 때문에 FOR 루프를 사용하여 TREEMAPS를 동적으로 생성하는 것 같습니다.
나는 이것을 가지고있었습니다 :
TreeMap keyDay = new TreeMap();
TreeMap keyRoom = new TreeMap();
TreeMap keyTime = new TreeMap();
.
그러나 키의 중복을 허용하기 위해 분명히 충분하지 않은 것은 3 개입니다. '0900'(시간 키) 또는 예제. '방 1'(룸 키)는 오래된 것들을 덮어 씁니다.
누구나 제안 사항이 있습니까? )
해결책
나는 그것이 정말로 슈퍼 메가 나쁜 것에 동의한다.그러나이 기능을 구현하려면 해시 맵을 사용하는 것이 좋습니다.다음은 원하는 기능을 구현하는 클래스입니다.
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보다 무한히 더 효율적이라는 것을 약속합니다.행운을 빌어!
다른 팁
는 그 날이 실제로 enum임을 가정하므로 최상위 레벨 맵은 enummap이어야합니다
Map<Day, Map<String, Map<Integer, String>>> bookings = new EnumMap<Day, Map<String, Map<Integer, String>>>(Day.class);
. 정말로 답변이 아니라 오히려 생각;)
실제로 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);
}
.