a collection data structure to keep items sorted
It seems like Collection.Sort
is actually the way to go here since when the collection is already almost sorted, the sorting will take not longer than O(n) in the worst case.
List is an ordered collection, which means you need to have the ability to access with index. If a collection internally shuffles or sorts the elements, the insertion order wont be same as the order of the elements in the internal data structure. So you cannot depend on index based access anymore. Hence Sun didn't provide a SortedList or a TreeList class. That is why you use Collections.sort(..)
Apache commons-collections does provide a TreeList class but it is not a sorted List and is called so because it uses a tree data structure to store the elements internally. Check its documentation here - http://commons.apache.org/proper/commons-collections/javadocs/api-3.2.1/org/apache/commons/collections/list/TreeList.html
Instead of using Collections.sort(myArrayList)
after every insertion you might want to do something a bit smarter as you know that every time you insert an element your collection is already ordered.
Collections.sort(myArrayList)
takes 0(nlogn) time, you could do an ordered insert in an ordered collection in O(n) time using Collections.binarySearch
. If the collection is ordered in ascending order Collections.binarySearch
returns the index of the element you are looking for if it exists or (-(insertion point) - 1)
. Before inserting an element you can look for it with Collections.binarySearch
(O(logn) time). Done that you can derive the index at which inserting the new element. You can then add the element with addAt
in O(n) time. The whole insertion complexity is bounded by the addAt
so you can do an ordered insert in an ArrayList in O(n) time.