Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中有序对象的最佳列表实现?_Java - Fatal编程技术网

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

Java中有序对象的最佳列表实现?,java,Java,我目前的情况是,我有一个“约会”对象的LinkedList,这些对象具有以下属性: “病人” “日期” “类型” 唯一需要的功能是循环浏览此LinkedList并按“日期”顺序显示每个约会。因此,每次创建新约会时(使用与LinkedList of Appointment相同的类中名为“addAppointment”的方法),该方法将使用比较器对链接列表进行排序 然而,我想知道这是否是一种不好的做法,是否有更好的方法来做到这一点?我从不需要通过“约会”对象的索引来获取它,因此使用优先级队列是更好的

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

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

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


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

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


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

使用
优先级队列

为您的
appointment
对象编写一个
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());
}
PriorityQueue schedule=new PriorityQueue();
预约a1=新预约();
预约a2=新预约();
附表.增补(a1);
附表.增补(a2);
//迭代删除计划中剩余的最早约会
while(schedule.peek!=null){
System.out.println(schedule.poll().toString());
}

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


如果你总是在列表的中间插入很多内容,那么这些内容的表现会更好,但你似乎主要是从你所说的内容中阅读此列表,所以请选择ArrayList。

可能重复的内容我也忘了添加属性可能需要修改,就像约会更改日期或类型一样。@ElliottFrisch在这种情况下,元素都是可以区分的,我认为
SortedSet
最有意义。@chrylis我不反对,但这是一个接口。我想你的意思是说,
SortedSet
只要不允许“重复”,就可以了。然而,对于需要排序的对象集(例如,每次程序运行只需要排序几次),这种非常好的方法确实适用。
TreeMap
或类似容器的问题在于,每次添加新条目时,它们几乎都会对列表进行排序。我确实需要在每次添加新条目时对列表进行排序,因为应用程序要求在运行时创建新的约会对象,然后再将其添加到列表中。ArrayList可能不是最佳选择。TreeSet可能更好。这也可能毫无意义。添加到树集确实保持排序顺序,但是我会考虑列表通常是如何读取的,而不是经常添加项目。如果有足够多的附加项,一旦您获得足够的项目,您可能会看到TreeSet的性能更好(我们谈论了很多)。使用集合排序。sort()是O(n log n)。添加到树集合的是O(log n)。顺便说一下,如果您确实使用TreeSet,请注意如何实现hashcode和equals。如果只比较日期上的项目,则具有相同日期的两个项目将相互覆盖。