Efficiently filter an ArrayList in Java/Android

android, arraylist, filter, java

Solution

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.

Problem

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); } } } ```

Original source

Related problems