我有大约 29,000 条记录的记录集。我的屏幕包含用于搜索条件的 EditText 框和包含所有 29,000 条记录的 ListView 。
通过使用列出的方式进行搜索需要时间,并且不会按我的需要提供更少的输出。
我的 EditText 包含
final EditText txtSearchCity = (EditText) findViewById(R.id.edtCity);
txtSearchCity.addTextChangedListener(new TextWatcher() {
@Override
public void afterTextChanged(Editable s) {
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
aCountryIDTemp.clear();
aCityStateTemp.clear();
for (int i = 0; i < aCountryID.size(); i++) {
if (aCityState
.get(i)
.toLowerCase()
.contains(
txtSearchCity.getText().toString()
.toLowerCase())) {
aCountryIDTemp.add(aCountryID.get(i));
aCityStateTemp.add(aCityState.get(i));
}
}
BindList();
}
});
}
BindList() 方法将数组列表 aCityStateTemp 设置为适配器。 任何其他动态搜索和创建新 ArrayList 的方法。
最佳答案
我会坚持使用 Lambdaj库,主要用于您希望限制用于排序和过滤集合的循环的情况。
这是一个使用 lambdaj 进行过滤的小例子 ArrayList
.
ArrayList<String> sortedArrayList = select(arrList, having(on(String.class),
Matchers.containsString("a");
这将返回一个完整的过滤 ArrayList
你想用它来填充你的 ListView
.
您也可以filter
自定义类 - Java: What is the best way to filter a Collection?
更新:
上述解决方案是 case-sensitive
所以要变通,你可以添加 Multiple Matchers .
像这样你可以添加Multiple Matchers
,
ArrayList<String> sortedArrayList = select(arrList, having(on(String.class),
(Matchers.anyOf(Matchers.containsString("a"),Matchers.containsString("A")))));
更新:
更好的方法是使用 filter(Matcher<?> matcher, T...array)
这里是你如何做到这一点,
ArrayList<String> sortedArrayList = filter(Matchers.anyOf(
Matchers.containsString("a"),Matchers.containsString("A")), arrList);
此外,如果您有兴趣使用 lambdaj
的某些方法/功能| ,您可以提取源代码并使其正常工作。我正在为 filter()
添加相同的内容
您可以直接下载 hamcrest-all-1.0.jar(63 kb)
并添加以下代码以获取 filter()
工作
public static <T> List<T> filter(Matcher<?> matcher, Iterable<T> iterable) {
if (iterable == null)
return new LinkedList<T>();
else{
List<T> collected = new LinkedList<T>();
Iterator<T> iterator = iterable.iterator();
if (iterator == null)
return collected;
while (iterator.hasNext()) {
T item = iterator.next();
if (matcher.matches(item))
collected.add(item);
}
return collected;
}
}
因此,您可以从 lambdaj
中找出最少的源并集成到您的源中。
关于安卓 : Search from Large Arraylist,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10383219/