Java - 用于预订系统的 HashMap

Java - HashMap for booking system

我得到了一个练习来开发适当的数据结构来实施网球场预订系统。

为此需要哈希图,我得到了一张图表作为数据结构的可视化表示。

看图,我不清楚HashMap中的Key和Value应该怎么定义。 'Court' 应该是 class 吗?

对于值,它显示时间和玩家姓名。既然有时间和玩家姓名两个值,那么这个值怎么定义?

diagram link

Date1(多好的名字)是 Map<String, Court> 个法院的名称,例如“court1”。法院有字段名称和保留列表。

所以键(可能)是一个字符串,而 class 本身就是值。人们经常看到,key/ID 也保存在值 class 中。所以一个Court对象就足以得名了。

为每个 Date1 创建一个 HashMap 是一种奇怪且令人困惑的方法,因为 HashMap 不能真正代表我们理解的日期。但鉴于这是作业,您必须保留有关球场编号、比赛时间和参赛者姓名的信息。这些至少是三个字段,如果我们将竞争对手的名字连接到一个 String.

如果只使用 HashMap 你可能不得不使用 multi-dimensional HashMap.

HashMap<Integer, HashMap<String, String>> Date1 = new HashMap<String, HashMap<String, String>>();

外部 HashMap 法院编号作为 type Integer 的键和 对作为 type[ 的值=44=] HashMap。 内部 HashMapplaytime 保存为类型 String 的键(尽管您也可以使用类型 Time)和 c参赛者姓名为类型值 String.

创建这个时,生成额外的访问器以避免繁琐的链式调用 Date1.get(someIntVariable).get(someStringOrTime) 来接收玩家的名字是至关重要的。

public HashMap<String, String> getPairingsForCourt(int court) {
    return Date1.get(court);
}

public String getPlayersForCourtOnTime(int court, String time) {
    return getPairingsForCourt(court).get(time);
}

无论如何要熟悉 HashMap 的所有方面都需要一些时间。特别是当你遇到像 keySet()entrySet() 这样的机制时。在这里查看详细但易于理解的开始: A Guide to Java HashMap

假设我们有一个名为“Date1”的 HashMap。 好吧,现在我可以在这个“Date1”HashMap 中放置一个带有键的值,然后可以使用键检索该值 -> Date1.get("key")

根据您的图表,按键将是 court1,court2,....

这样,当我请求 Date1.get("court1") 时,我可以得到 this ArrayList

但是,在这个数组列表中,每一行都包含两个值。如果我们的列表每一行都有一个字符串值,我们可以说这是一个字符串类型的数组列表。

所以让我们自己制作 class(比如一个类型),它可以存储两个值(比如“9:00”、“玩家”)

public class EntryInfo{
    String time, player;
    
    public EntryInfo(String time, String player) {
        this.time = time;
        this.player = player;
    }
}

因此,如果我们创建一个“EntryInfo”对象 class,该对象将能够存储两个值 - 我们的数组列表的每一行都是这种类型。

所以,让我们总结一下:

我们的哈希映射键将是“court1, court2...” 每个键将保存 ArrayList<EntryInfo> 类型的值。

所以我们的 hashmap 会像 HashMap< String, ArrayList<EntryInfo> >


现在,让我们根据您的图表想象一下场景。

首先说说使用场景。 比如说,你们学校有几个法院。它们被命名为 court1, court2, court3, ...

好吧,我想要今天的 entry-log court1。 所以,我只要求 feb9.get("court1"),它会 return 一个列表(ArrayList),我可以遍历该数组以查看日志,如下所示:

for(EntryInfo entryinfo : feb9.get("court1") ) {
    System.out.println(entryinfo.time + " : " + entryinfo.player);
}
    

是的,就是这样。如果我想获取 court2 的日志,我将使用键“court2”检索值

现在,让我们讨论如何制作这个。

那么今天是 2 月 9 日,让我们制作一个 hashmap 来存储今天的登录日志。让我们将哈希图命名为“feb9”

HashMap<String, ArrayList<EntryInfo>> feb9 = new HashMap<String, ArrayList<EntryInfo>>();

你们学校有 3 个球场。让我们向这个 hashmap 添加 3 个不同的键,这样它可以为每个键(court)

保存 3 个独立且对应的 entry-logs
feb9.put("court1", new ArrayList<EntryInfo>());
feb9.put("court2", new ArrayList<EntryInfo>());
feb9.put("court3", new ArrayList<EntryInfo>());

您可以将此与创建 3 个名为 court1、court2 和 court3 的新文件联系起来。每个文件由一个 ArrayList 对象组成,目前是空的。

说,现在 9:00 上午,玩家“zineryt”进入 court1。让我们将日志输入我们的 hashmap

feb9.get("court1").add(new EntryInfo("9:00", "zineryt"));

这里feb9.get("court1")会return一个ArrayList,我们使用add()方法向ArrayList中插入元素。

比如,在 9:50am,玩家“bigboy”进入 court1。我们可以像下面这样进入日志

feb9.get("court1").add(new EntryInfo("9:50", "bigboy"));

事情是这样的。

为了明天的信息,我们将创建另一个名为 feb10 的新 HashMap,并将遵循相同的步骤。