2015-05-19 32 views
-1

我正在尝试创建一个简单的预约系统来练习TDD。我最初尝试了一个ArrayList,其中有一些代表时间的空格,然后是一个Map,两者似乎都很接近,但最终都没有奏效。 Immutibilty是关键,我用了一个构造函数来设置的能力,想有二传手依赖于字符串值的空字符串岬或nullabilty(试用过):java中简单预订系统的最佳数据类型

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数据结构中。

下一步就是让教室成为自己的班级和一个枚举,但首先我必须弄清楚基础知识!

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

太多的辩论,人...我相信会有一个不同的和独特的设计,为eqch我们之一的应用创意... – eduyayo

回答

0

那么,这取决于预订。如果预订位置较小(预约单位为一小时,学校开放时间为上午9点至下午5点),则可以将每个小时作为地图结构中的关键字。但是,如果您的预订应用程序使用了一天以上,则必须将日期(ddmmyyyy)与地图(Map>)关联。

如果预订时间很复杂(可以从8点20分到11点10分),那么您需要一个预订实体,其中包含预订开始日期,预订结束日期和教室字段。然后,您将在与预订数据库交互的方法中实施预订逻辑。该方法将检查是否存在与我们想要创建的预订相冲突的预订。如果是这种情况,该方法引发一个例外;否则会创建一个新预订。

为了更好地理解要使用哪个Java结构,您必须知道每个结构的特性。有一个简单的总结here

0

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

散列表中的运行时间是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 /表。