Android:从大型Arraylist搜索

Vis*_*har 4 arrays android 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();
            }
        });
    }
Run Code Online (Sandbox Code Playgroud)

BindList()方法将arraylist aCityStateTemp设置为adapter.任何其他方式动态搜索和创建新的ArrayList.

Lal*_*ani 14

我坚持使用Lambdaj Library,它主要用于你想要限制循环以进行排序和过滤集合的情况.

这是使用lambdaj进行过滤的一个小例子ArrayList.

ArrayList<String> sortedArrayList = select(arrList, having(on(String.class),
                                                   Matchers.containsString("a");
Run Code Online (Sandbox Code Playgroud)

这将返回一个完整的过滤ArrayList,您希望填充您的ListView.

您还可以使用filter自定义类 - Java:过滤集合的最佳方法是什么?

更新:

以上解决方案是case-sensitive如此解决您可以添加多个匹配器.

像这样你可以添加Multiple Matchers,

ArrayList<String> sortedArrayList = select(arrList, having(on(String.class),
   (Matchers.anyOf(Matchers.containsString("a"),Matchers.containsString("A")))));
Run Code Online (Sandbox Code Playgroud)

更新:

更好的方法是使用 filter(Matcher<?> matcher, T...array)

这是你如何做到的,

ArrayList<String> sortedArrayList = filter(Matchers.anyOf(
           Matchers.containsString("a"),Matchers.containsString("A")), arrList);
Run Code Online (Sandbox Code Playgroud)

此外,如果您对使用某些方法/功能感兴趣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;
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,您可以从lambdaj源代码中找出最少的内容并在源代码中集成.