I have a situation whereby I'm populating an ArrayList
with "TransactionEvent
"s. TransactionEvent
has a property "transaction ID". In the large majority of cases each new event has a transaction ID greater the previous event's ID - However, this is not guaranteed; i.e. the data is almost sorted.
My question is this: How can I perform fast look-ups based on transaction ID? My current idea is to call Collections.binarySearch(...)
and if this fails then perform a linear search. However, I notice the Javadoc states that the result of binarySearch is undefined is the data is unordered so I may have to roll my own implementation.
Additional:
List
is the basis for a TableModel
currently performing very slowly when containing a large number of rows (100,000).Any help appreciated.
A dictionary is 6.6 times faster than a list when we lookup in 100 items.
It is well-known that in Python tuples are faster than lists, and dicts are faster than objects.
It is more efficient to use dictionaries for the lookup of elements as it is faster than a list and takes less time to traverse. Moreover, lists keep the order of the elements while dictionary does not. So, it is wise to use a list data structure when you are concerned with the order of the data elements.
Generally the lists are faster than sets. But in the case of searching for an element in a collection, sets are faster because sets have been implemented using hash tables.
You could keep the ArrayList sorted by searching for the insertion point as you add each TransactionEvent
. Collections.binarySearch returns
index of the search key, if it is contained in the list; otherwise, (-(insertion point) - 1). The insertion point is defined as the point at which the key would be inserted into the list: the index of the first element greater than the key, or list.size(), if all elements in the list are less than the specified key. Note that this guarantees that the return value will be >= 0 if and only if the key is found.
Once you search for the insertion point you can use the ArrayList add(int index, Object element) method instead of just adding to the end of the list as you would normally. This will slow down each insertion by a small factor, but it will enable you to use binary search for fast look-up.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With