【问题标题】:Best data type for a simple reservation system in javajava中简单预订系统的最佳数据类型
【发布时间】:2015-07-31 17:42:49
【问题描述】:

我正在尝试创建一个非常简单的预订系统来练习 TDD。我最初尝试了一个 ArrayList ,它有一组代表时间的空格,然后是一个 Map ,两者看起来都很接近,但最终都没有奏效。 不变性是关键,我使用构造函数来设置容量,并试图让设置器依赖于字符串值的空字符串或可空性(都尝试过):

public class BookingSystem {

    private BookingSystem bookingSystem;
    private Map<Integer, String> classList;

    public HashMap<Integer, String> setClassList() {
        for (int i=0;i<24; i++) {
            classList.put(0, "");
        }
        return classList;
    }

    public void bookClassroom(int time, String room) throws BookedException {
        if (classList.get(time).equals("")) {
            classList.put(time, room);
        } else {
                throw new BookedException();
        }
    }

这似乎是一种 hack,但对我来说似乎也是合乎逻辑的。 HashMap 是否矫枉过正,一个简单的列表或数组就足够了吗?我已经尝试了所有这些,但还没有完全成功,现在我觉得我现在过度陷入了许多 Java 数据结构中。

下一步是让 Classrooms 成为自己的类和枚举,但首先我必须掌握基础知识!

  • 编辑:被困在防火墙后面,不允许我评论其他人的帖子。数组/列表/地图的每个索引应该足够“一个小时”。该列表将是 8 或 24 个索引长(没关系,因此性能不是问题)。

【问题讨论】:

  • 争论太多了,伙计...我敢肯定,我们中的一个人在表达想法时会有一种不同且独特的设计...

标签: java list dictionary types hashmap


【解决方案1】:

嗯,这取决于预订。如果预订时段的集合很小(预订单位是一个小时,学校从上午 9 点到下午 5 点开放),那么您可以将每个小时作为地图结构中的一个键。但是,如果您的预订应用程序使用超过一天,您必须将日期 (ddmmyyyy) 与地图 (Map>) 相关联。

如果预订时间很复杂(可以从 8:20 到 11:10),您将拥有一个具有预订开始日期、预订结束日期和课堂字段的预订实体。然后,您将在与预订数据库交互的方法中实现预订逻辑。该方法将检查是否存在与我们要创建的预订相冲突的预订。如果是这种情况,该方法会引发异常;否则会创建一个新的预订。

要更好地了解要使用哪种 Java 结构,您必须了解每个结构的特殊性。有一个简短的总结here

【讨论】:

    【解决方案2】:

    “不变性”约束使 Hashmap/表更难实现,因为您的表会变得非常臃肿。

    Hashtable 中的运行时间是 O(1) 摊销的。但是,哈希表会变得过于密集,导致运行时间为 O(N)。我相信重新散列使这种情况非常罕见,并将运行时间减少到 O(1)。

    如果你正在实现一个 ArrayList,运行时是 O(N) 最坏的情况。但是,如果您知道元素的确切位置,则它是 O(1) 运行时。总体而言,随着预订数量的增加,使用 ArrayList 时,搜索/插入/删除的平均运行时间会更高。

    为了提供最高效率,每次当前 ArrayList 填充时,您必须将结构增加 n/2 个元素。起初这可能看起来不错,但是当您有大量可能的预订时会发生什么?您的资源被严重占用。


    就个人而言,我会尝试实现 AVL-Tree。这遵循二叉搜索树属性,这将使您的预订时间保持有序,同时保持您的树平衡(节省空间和搜索/插入/删除运行时)。

    AVL-Tree 为搜索插入和删除提供 O(log N) 的运行时间,以及 O(N) 的最坏情况空间。随着保留数量的增加,AVL-Tree 的性能将明显优于 ArrayList 的 Hashmap/表。

    【讨论】:

      猜你喜欢
      • 2015-02-02
      • 2022-01-11
      • 2022-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多