首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何创建嵌套的TreeMaps?

如何创建嵌套的TreeMaps?
EN

Stack Overflow用户
提问于 2011-03-28 02:14:11
回答 3查看 3K关注 0票数 0

这在某种程度上与我之前的问题有关,但我意识到我需要在问题的早期处理嵌套的问题,所以我在这里(我也不是Java的初学者,所以请耐心听我说)。

我正在为5个房间创建一个简单的预订系统,它将接受名称,时间,房间编号和天数。这必须使用嵌套的TreeMaps来完成。下面是我所看到的数据布局,其中where表示TreeMap的边界:

(天,(房间号,(时间,名称))

据我所知,我需要一个用于时间和名称的TreeMap,每个房间一个,然后每天一个。这意味着每个房间每天一次/名称树映射,也就是1 x 5 x 7= 35 TreeMaps。如下所示:

代码语言:javascript
复制
{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)]}

(不同的括号类型代表嵌套TreeMaps的边界)

得出这个结论后,我的下一个问题是迭代遍历一个循环来创建所有这些TreeMaps。我似乎不能使用for循环动态生成TreeMaps,因为我不能将计数器的变量数字附加到新创建的树状图的名称上。

我确实有这个:

代码语言:javascript
复制
TreeMap keyDay = new TreeMap();
TreeMap keyRoom = new TreeMap();
TreeMap keyTime = new TreeMap();

但它只有三个,这显然不足以允许键的复制-任何新的条目,例如'0900‘(时间键)或例如。‘房间1’(房间钥匙)将覆盖旧的房间。

有人有什么建议吗?将非常感谢:)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-03-28 04:32:54

我同意这真的是超级糟糕。但是如果你想实现这个功能,我推荐使用HashMaps。下面是一个实现所需功能的类:

代码语言:javascript
复制
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;
    }
}

}

下面是一个运行预留类的main:

代码语言:javascript
复制
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和单个条目,它产生:

代码语言:javascript
复制
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

这个结果是在不到一秒的时间内产生的。我保证这比嵌套TreeMaps的效率要高得多。祝好运!

票数 3
EN

Stack Overflow用户

发布于 2011-03-28 02:45:18

人们可能会假设日期实际上是一个枚举,因此顶级映射应该是一个EnumMap

代码语言:javascript
复制
Map<Day, Map<String, Map<Integer, String>>> bookings = new EnumMap<Day, Map<String, Map<Integer, String>>>(Day.class);
票数 0
EN

Stack Overflow用户

发布于 2011-03-28 02:50:04

不是真正的答案,而是一种想法;)

实际上,正如xappymah在评论中指出的那样,更自然的方法是为您的任务发明特定于领域的类型。像这样:

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5451233

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档