有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java中有序对象的最佳列表实现?

我目前的情况是,我有一个“约会”对象的LinkedList,这些对象具有以下属性:

“病人” “日期” “类型”

唯一需要的功能是循环浏览此LinkedList,并按“日期”顺序显示每个约会。因此,每次创建新约会时(使用与LinkedList of Appointment相同的类中名为“addAppointment”的方法),该方法都会使用比较器对链接列表进行排序

然而,我想知道这是否是一种不好的做法,是否有更好的方法来做到这一点?我永远不需要通过索引获取“约会”对象,所以使用优先级队列会更好吗


共 (3) 个答案

  1. # 1 楼答案

    一般来说,在需要随机访问时使用ArrayList,在需要大量插入和删除时使用LinkedList。如果您需要一个保持排序的数据结构,PriorityQueue是一个选项,但它确实适用于只按顺序提取顶层元素的场景。如果需要反复迭代这些元素,请使用SortedSet

    如果元素排序中涉及的字段在插入到任何已排序的集合后发生更改,则应删除并重新添加该元素(最好在修改前删除)

  2. # 2 楼答案

    到目前为止,我不同意这里的每个人的观点,我会说,继续使用一个简单的ArrayList。您的主要用例只是循环浏览列表并按顺序显示,对吗?可以使用集合对数组列表进行排序。sort()方法,该方法将对任何对象列表进行排序。所以只需在约会对象中实现Comparable(只需要提供一个.compareTo()方法。。。API很好地解释了这一点,或者Java Trail on Collections),然后您的排序将变得轻松而轻松。我的经验是,这比TreeSet或LinkedList这样的对象性能更好

    如果你总是在列表的中间插入很多内容,那么它们的性能会更好,但是你似乎主要是从你所说的内容中阅读这个列表,所以选择ArrayList

  3. # 3 楼答案

    使用PriorityQueue

    Appoitnment对象编写一个compareTo方法,根据日期指定自然顺序

    PriorityQueue<Appointment> schedule = new PriorityQueue<Appoitnment>();
    Appointment a1 = new Appointment();
    Appointment a2 = new Appointment();
    schedule.add(a1);
    schedule.add(a2);
    
    // Iteratively removes the earliest appointment remaining in the schedule
    while (schedule.peek != null) {
      System.out.println(schedule.poll().toString());
    }