如果ArrayList的已排序集合扩展超过其初始大小,它是否会变为未排序?

时间:2012-03-14 20:03:07

标签: java collections arraylist sorting

我有一个我最初排序的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

4 个答案:

答案 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类是个不错的选择。