java中简单预订系统的最佳数据类型

时间:2015-05-19 18:28:04

标签: java list dictionary types hashmap

我正在尝试创建一个简单的预约系统来练习TDD。我最初尝试了一个ArrayList,其中有一组空格代表时间,然后是Map,两者似乎都很接近,但最终都没有。 Immutibilty是关键,我使用了一个构造函数来设置容量,并试图让setter依赖于String-value的空字符串或nullabilty(试过两者):

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();
        }
    }

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

下一步是让Classrooms成为自己的类和枚举,但首先我要把基础知识搞定下来!

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

2 个答案:

答案 0 :(得分:1)

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

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

为了更好地理解要使用的Java结构,您必须知道每个结构的特殊性。这里有一个简短的摘要here

答案 1 :(得分:0)

&#34;不变性&#34;约束使得Hashmap /表更难实现,因为你的表会变得非常臃肿。

Hashtable中的运行时间是O(1)摊销的。但是,哈希表变得太密集,导致O(N)的运行时间。我相信rehashing使这种情况非常罕见,并将运行时减少回O(1)。

如果要实现ArrayList,则运行时为O(N)最坏情况。但是,如果您知道元素的确切位置,则它是O(1)运行时。总的来说,随着预留数量的增加,使用ArrayList时,搜索/插入/删除的平均运行时间会更长。

为了提供最高效率,每次当前ArrayList填充时,您必须使用n / 2个元素来增加结构。这一开始可能看起来不是很糟糕,但是当您有大量可能的预订时会发生什么?您的资源受到严重限制。

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

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