4

私は約29,000レコードのレコードセットを持っています。画面には、検索基準のEditTextボックスと、29,000件すべてのレコードを含むリストビューが含まれています。

リストされた方法で検索することにより、時間がかかり、必要に応じてフローの出力が少なくなりません。

私の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()メソッドは、arraylistaCityStateTempをアダプターに設定しています。新しいArrayListを動的に検索および作成するその他の方法。

4

4 に答える 4

14

コレクションの並べ替えとフィルタリングのループを制限したい場合に主に使用されるLambdajライブラリを使用することを強くお勧めします。

フィルタリングに lambdaj を使用する小さな例を次に示しますArrayList

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

これは、ArrayListあなたのListView.

filterカスタムクラスもできます- Java: コレクションをフィルタリングする最良の方法は何ですか?

アップデート:

上記の解決策は、 Multiple Matcherscase-sensitiveを追加できることを回避するためのものでした。

このように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ソースに統合することができます。

于 2012-05-01T10:21:07.493 に答える
2

高速検索には、HashSet または LinkedHashSet (挿入順序を保持) を使用できます。そのクラスの contains() メソッドを使用します。

于 2012-04-30T11:52:09.530 に答える
1

初期化中にaCityStateTempあなたがあなたに渡したと思いますAdapterArrayListAdapter

の内容を変更しaCityStateTempたら、 を呼び出すだけですadapter.notifyDataSetChanged()aCityStateTempto アダプターを new として設定する必要はありませんArrayList

于 2012-04-30T12:22:57.517 に答える
0

すべてのデータを sqlite データベースに保存し、like クエリを使用して検索されたアイテムを取得できます。

于 2012-04-30T13:07:57.247 に答える