我有一个我最初排序的ArrayList。当我添加它时,我会这样做:
Index = Collections.binarySearch(Data.fileList, fileEntry, FileData.COMPARE_BY_FNAME);
if (Index >=0)
fileEntry = Data.fileList.get(Index) // get the object that matches
else
Data.fileList.add ((Index+1)*-1, fileEntry) // add the new object
将条目添加到正确的位置,因此我不必再次排序(我相信)。
当ArrayList变大时,我最终会有重复的条目,所以我认为它不再排序。
我认为当ArrayList超出其初始大小并被扩展时,我的集合不再被排序。
Q1)这是真的吗? Q2)有没有办法判断集合是否不再排序?有没有办法判断ArrayList是否已经扩展?或者我必须在每次插入后进行排序? Q3)ArrayList.size()返回列表中的元素数。有没有办法告诉清单的容量?
感谢。 -J
答案 0 :(得分:4)
考虑使用保证排序插入的数据结构,如TreeSet
。除此之外,我猜测问题出在你的算法中,在ArrayList中进行排序插入,而且与ArrayList的增长无关。
答案 1 :(得分:1)
当ArrayList变大时,我最终会有重复的条目,所以我认为它不再排序。
只要您在正确的位置添加内容,它就会保持排序状态。这里的“重复条目”并不是很清楚你的意思 - 但是没有任何关于扩展ArrayList
的重新排序的信息。
另一方面,使用排序的集合开始(如ÓscarLópez所建议的那样)会让你的生活变得更简单。
答案 2 :(得分:0)
如果您想要一个始终排序的集合,ArrayList
不是您真正想要使用的工具。有些专门用于保持分类的集合。
如果您想允许重复,PriorityQueue
是您最好的选择。如果您可以忽略重复项,TreeSet
可能是更好的选择。
答案 3 :(得分:0)
调整大小与它无关。排序顺序不是List合同的一部分。列表只是一个有序集合。订单取决于添加元素的人员。当ArrayList调整大小时,它只是重新分配底层数组,并以相同的顺序将现有数据复制到新数组。
如上所述,如果要在添加时对事物进行排序,则应使用SortedSet(特别是TreeSet)。如果你想允许重复,那么commons-collections中的TreeBag类是个不错的选择。