[英]How do I create nested TreeMaps?
This is somewhat related to my previous question but I've realised that I needed to deal with the issue of nesting earlier in the problem, so here's where I am. 这与我之前的问题有些相关,但我意识到我需要在问题的早期处理嵌套问题,所以这就是我的位置。 (I'm also not far off being a beginner in Java, so please bear with me).
(我也不远是Java的初学者,所以请耐心等待我)。
I'm creating a simple booking system for 5 rooms which will take in names, times, room numbers and days. 我正在为5个房间创建一个简单的预订系统,它将记录姓名,时间,房间号码和天数。 This has to be done using nested TreeMaps.
这必须使用嵌套的TreeMaps来完成。 Here's the layout of the data as I see it, where paretheses represent the boundaries of a TreeMap:
这是我看到的数据布局,其中paretheses表示TreeMap的边界:
(Day, (Room #, (Time, Name))) (日,(房间#,(时间,名称)))
As far as I can see, I need one TreeMap for times and names, one for each room, then one for each day. 据我所知,我需要一个TreeMap用于时间和名称,每个房间一个,然后每天一个。 That means one time/name treemap per room per day, which means 1 x 5 x 7 = 35 TreeMaps.
这意味着每个房间每天一个时间/名称树形图,这意味着1 x 5 x 7 = 35个TreeMaps。 Like this:
像这样:
{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)]}
(the different bracket types represent the boundaries of the nested TreeMaps) (不同的括号类型表示嵌套的TreeMaps的边界)
Having come to that conclusion, my next problem is iterating through a loop to create all those TreeMaps. 得出这个结论后,我的下一个问题是迭代循环来创建所有那些TreeMaps。 I can't seem to dynamically generate the TreeMaps using a for loop, because I can't stick a counter's variable number onto the newly-created TreeMap's name.
我似乎无法使用for循环动态生成TreeMaps,因为我无法将计数器的变量号粘贴到新创建的TreeMap名称上。
I did have this: 我确实有这个:
TreeMap keyDay = new TreeMap();
TreeMap keyRoom = new TreeMap();
TreeMap keyTime = new TreeMap();
but it is only three, which is clearly not enough to allow for duplication of keys - any new entries for eg '0900' (time key) or eg 'Room 1' (room key) will overwrite the old ones. 但它只有三个,显然不足以允许重复键 - 例如'0900'(时间键)或例如'Room 1'(房间键)的任何新条目将覆盖旧的条目。
Does anyone have any suggestions? 有没有人有什么建议? Would be much appreciated :)
非常感谢:)
I agree it is really super mega bad. 我同意它真的超级糟糕。 But if you want to implement this functionality, I recommend HashMaps instead.
但是如果你想实现这个功能,我建议改为使用HashMaps。 Here is a class that implements the functionality you want:
这是一个实现所需功能的类:
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;
}
}
} }
Here is a main that runs the Reservations class: 这是一个运行Reservations类的main:
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");
}
}
}
And finally, using SetupMap and the single entry, it produces: 最后,使用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
That result was generated in less than a single second. 这个结果是在不到一秒的时间内产生的。 I promise that is infinitely more efficient than nested TreeMaps.
我保证这比嵌套的TreeMaps更有效。 Good Luck!
祝好运!
可以假设这一天实际上是枚举,因此顶级地图应该是EnumMap
Map<Day, Map<String, Map<Integer, String>>> bookings = new EnumMap<Day, Map<String, Map<Integer, String>>>(Day.class);
Not really an answer, but rather a thought ;) 不是一个答案,而是一个想法;)
Indeed, as xappymah pointed out in comments, more natural approach would be to invent domain-specific types for your task. 实际上,正如xappymah在评论中指出的那样,更自然的方法是为您的任务创建特定于域的类型。 Like:
喜欢:
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);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.