【发布时间】:2013-11-05 23:54:10
【问题描述】:
我有一个 MyObjects 的 ArrayList。 MyObjects 类有 10 多个属性,但我只需要从 4 个属性中搜索。用户将按下按钮并能够选择property1 的值。
假设用户将选择property1Value1、property1Value2 和property1Value4,然后他将按下按钮并选择property2 值:property2Value1、property2Value5、property2Value7 等等。这些是filter1和filter2。
property2Value2、property2Value3 和 property2Value4 对用户不可见,因为他使用 filter1 过滤掉了。就像在他进入新的过滤屏幕之前进行搜索一样。
我需要将他在每个过滤器中选择的内容存储在某个地方,因为当他返回导航时,我必须向他显示所选值。
我认为用图片更容易理解,因为在 ebay 上实现了类似的功能:
一开始没有过滤器:用户可以选择每个属性的所有值:
用户选择“平板电脑”作为类型属性。 - 搜索完成,一些属性值不再可见:
第二个过滤值被选中:
按下(自动)搜索我应该在 SQL 中做这样的事情:
SELECT * FROM MyObjects WHERE
( (property1 = property1Value1) || (property1 = property1Value2) || (property1 = property1Value4) )
AND
( (property2 = property2Value1) || (property2 = property2Value5) )
由于我在内存中有对象,我认为创建 sqlLite3 数据库不是一个好主意,写出来而不是选择。在 iOS 实现中,我做了非常复杂的缓存算法。缓存分离的过滤器值。一大堆辅助索引持有者(最少 20 个),因为对于每个过滤器,我都需要做一些额外的事情,这里没有提到,并且数据只存储一次。
我害怕将该算法重写到 Android,iOS 上的算法一定很简单。
编辑: 基本上我需要在 Java 对象搜索中重写那个 SQL 搜索。
编辑2: 基于 Multimap 的回答。
Multimap 并不比HashMap<String, <ArrarList<Integer>> 好
其中键是属性值 (property2Value3),值是我的 ArrayList<MyObjects> (1,2,3,4,5...100) 的索引列表
需要在每个过滤器上建立,每个过滤器值HashMap<String, <ArrarList<Integer>> 而不是我在那里,iOS...可能少了一些辅助集合。
有什么想法吗?
【问题讨论】:
-
A
Multimapis 如果您已经将对象保存在内存中,则比映射到 ID 字段更好;你没有包装类的开销,你不必手动查找对象,你可以直接执行Collection操作。Multimap几乎完全等同于Map<Key,Set<Value>>,但有一些额外的便利方法。
标签: java android search optimization collections