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