安卓 : Search from Large Arraylist

标签 android arrays arraylist

我有大约 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/

相关文章:

java - 查找 map 中每个键的平均对象字段

java - Android 工具栏菜单未在所有 Activity 中显示

java - 组合两个对象的ArrayList,并在组合时有条件地更改对象的值

java - java迭代器似乎正在丢失数据

c - 关于使用数组乘以 C 中的多项式

python - 为什么将列表初始化为空而不是具有预定大小是 Pythonic 的?

尝试使用指针打印值时 c 程序失败

android - 没有为 Android pre-3.0 预构建的 ActionBar?

java - 为什么 DefaultHttpClient 通过半关闭套接字发送数据?

java - 如何获取 View 的宽度和高度