在Java/Android中高效过滤ArrayList

use*_*146 11 java android arraylist filter

我正在开发一个Android应用程序(Android 1.6),但这可能是一个更普遍的Java问题.

我有一个大约10,000个对象的ArrayList

对象包含3个字符串(firstName,middleName,lastName).

在android上向用户呈现"搜索框",他们可以通过键入部分名称来搜索特定的"对象".

我有一个类(我称之为Filterer),它在10,000个列表中搜索匹配的对象,然后将它们作为"子列表"返回.

搜索有点慢(特别是在Android手机上),我确信我没有以最有效的方式进行搜索/过滤.

有没有人对如何加快搜索有任何建议?我的代码如下.一种可能性来搜索已经包含小写和连接的每条信息的辅助"masterList"......但是可能有其他方法来改进这种搜索也会有所帮助.

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);
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

Chr*_*Orr 7

是的,为每个循环迭代降低几个对象(加上可能是冗余的toString?)肯定是痛苦的,并且list.size()每次迭代调用也是不好的做法- 该值应该在循环开始之前缓存.

无论如何,如果您正在使用这么多数据,是否有理由不使用SQLite数据库进行存储并使用CursorAdapter?显示/过滤列表?

这将是实现这种尺寸的推荐方法.

  • @Civil Disobedient:对于大多数JVM来说都是如此,但对于Android设备上的Dalvik VM来说却不一定如此.有关详细信息,请参阅http://developer.android.com/intl/fr/guide/practices/design/performance.html#cache_fields. (3认同)