の ArrayList がありMyObjects
ます。クラスにはMyObjects
10 個を超えるプロパティがありますが、4 つのプロパティからのみ検索する必要があります。ユーザーはボタンを押して、 の値を選択できますproperty1
。ユーザーがproperty1Value1
、 、property1Value2
およびを選択しproperty1Value4
、ボタンを押して、 、、 property2Value7 などのproperty2
値を選択するとします。これらは、filter1 と filter2 です。、 およびは、filter1 で除外されているため、ユーザーには表示されません。新しいフィルター画面に入る前に検索を行うようなものです。彼が戻ってきたときに選択した値を表示する必要があるため、各フィルターで選択したものをどこかに保存する必要があります。property2Value1
property2Value5
property2Value2
property2Value3
property2Value4
eBay で同様の実装が行われているので、写真があると理解しやすいと思います。
最初はフィルタなし: ユーザーは各プロパティのすべての値を選択できます:
ユーザーは type プロパティに「Tablet」を選択しました。- 検索が完了し、一部のプロパティ値が表示されなくなりました:
2 番目のフィルター値が選択されます。
(自動的に)検索を押すと、SQLで次のようにする必要があります。
SELECT * FROM MyObjects WHERE
( (property1 = property1Value1) || (property1 = property1Value2) || (property1 = property1Value4) )
AND
( (property2 = property2Value1) || (property2 = property2Value5) )
私はメモリ内にオブジェクトを持っているので、sqlLite3 データベースを作成するのは良い考えではないと思います。iOS の実装では、非常に複雑なキャッシュ アルゴリズムを実行しました。分離されたフィルター値をキャッシュします。補助インデックス ホルダー (最小 20) がたくさんあります。これは、ここでは言及されていませんが、フィルターごとに追加の作業が必要であり、データが一度だけ保存されるためです。
そのアルゴリズムをAndroidに書き直すのは怖いです.iOSにあるものは、簡単なものでなければなりません.
編集:基本的に、Javaオブジェクト検索でそのSQL検索を書き直す必要があります。
Edit2 : Multimap での回答に基づいています。
キーがプロパティの値 ( ) で、値が my へのインデックスのリスト(1,2,3,4,5...100)でMultimap
ある場合、 は a よりも優れていません。HashMap<String, <ArrarList<Integer>>
property2Value3
ArrayList<MyObjects>
各フィルター、各フィルター値を構築する必要がHashMap<String, <ArrarList<Integer>>
あり、iOS が正確にそこにいるよりも...おそらくいくつかの補助コレクションが少なくなります。
何か案が?