I'm developing an Android app (Android 1.6), but this is probably a more general Java question.
I have an ArrayList of about 10,000 objects
the objects contain 3 strings (firstName, middleName, lastName).
The user is presented with a "search box" on android where they can search for a particular "object" by typing in part of the name.
I have a class (which I call Filterer) that searches through the list of 10,000 for matching objects and then returns them as a "sublist".
The search is a little bit SLOW (especially on an Android handset) and I'm sure I'm not doing the search/filtering in the most efficient manner possible.
Does anyone have any suggestions on how to speed up my search? My code is below. One possibility to to search against a secondary "masterList" that already has every piece of information in lowercase and concatenated…but there may be additional ways to improve this search that would also help.
TIA!!
public void filterNames() {
this.filteredList.clear();
String sv = this.searchString.toString.trim().toLowerCase(); // search value
for (int i = 0; i < this.masterList.size(); i++) {
MyObject d = this.masterList.get(i);
String fn = d.getFirstName().toString().toLowerCase();
String mn = d.getMiddleName().toString().toLowerCase();
String ln = d.getLastName().toString().toLowerCase();
if (fn.indexOf(sv) >= 0 ||
md.indexOf(sv) >= 0 ||
ln.indexOf(sv) >= 0) {
this.currentList.add(d);
}
}
}
may be too late answer but it's help for other in stuck same problem.
Java 8 (2014) solves this problem using streams and lambdas in one line of code:
Using Stream Api you can filter data without for loop and more feature's are available.
List<MyObject> mFilteredMyObjectList = mMyObjectList.stream()
.filter(d -> d.getFirstName().toString().toLowerCase().indexOf(sv) >= 0
|| d.getMiddleName().toString().toLowerCase().indexOf(sv) >= 0
|| d.getLastName().toString().toLowerCase().indexOf(sv) >= 0).collect(Collectors.toList());
For more info see below link,
Link1 Link2
Yes, it's certainly painful to lower-case several objects for each loop iteration (plus a possibly redundant toString
?), and also bad practice to call list.size()
for every iteration — that value should be cached before the loop starts.
Anyway, if you're working with this much data, is there a reason that you're not using an SQLite database for storage and displaying/filtering your list using CursorAdapter
?
That would be the recommended way to implement something of this size.
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