У меня есть ArrayList MyObjects
. Класс MyObjects
имеет более 10 объектов, но мне нужно искать только 4 свойства. Пользователь нажмет кнопку и сможет выбрать значения для property1
. Допустим, пользователь выберет property1Value1
, property1Value2
и property1Value4
, чем он нажмет кнопку и сделает выбор для property2
значений: property2Value1
, property2Value5
, property2Value7 и так далее. Это фильтр1 и фильтр2. property2Value2
, property2Value3
и property2Value4
не отображается для пользователя, потому что он отфильтровывался с фильтром1. Это похоже на поиск, прежде чем он войдет в новый экран фильтра. Мне нужно где-то хранить то, что он выбрал в каждом фильтре, потому что, когда он перемещается назад, я должен показать ему выбранные значения.поиск объектов в памяти
Я думаю, легче понять, с фотографиями, так похожи реализованы на Ebay:
на начало Нет фильтров: пользователь может выбирать все значения для каждого свойства:
пользователь выбрал «Tablet» для свойства типа. - поиск производится и некоторые значения свойств не видно больше:
выбирается второе значение фильтра:
Нажатие (автоматически) поиск я должен сделать что-то как в SQL:
SELECT * FROM MyObjects WHERE
((property1 = property1Value1) || (property1 = property1Value2) || (property1 = property1Value4))
AND
( (property2 = property2Value1) || (property2 = property2Value5))
Поскольку у меня есть объекты в памяти, я не думаю, что это хорошо идея создать базу данных sqlLite3, выписать, чем выбрать. При реализации iOS я сделал очень сложный алгоритм кэширования. Кэширование значений фильтра разделено. Loooooot вспомогательных держателей индексов (мин. 20), потому что для каждого фильтра мне нужно сделать что-то дополнительное, не упомянутое здесь, и данные только один раз сохраняются.
Я боюсь переписать этот алгоритм на Android, что есть в iOS, должно быть что-то просто.
Редактировать: В принципе, мне нужно переписать этот SQL-поиск в поиске объектов Java.
Редактировать2: На основе ответа с помощью Multimap.
Multimap
не лучше, чем HashMap<String, <ArrarList<Integer>>
где ключ является значение свойства (property2Value3
) и значение списка индекса мой ArrayList<MyObjects>
(1,2,3,4,5 ... 100)
Нужно создавать на каждом фильтре значение каждого фильтра HashMap<String, <ArrarList<Integer>>
и точно там, где я, где iOS ... может быть, с несколькими вспомогательными коллекциями меньше.
Любая идея?
«Multimap» * лучше, чем карта в поле ID, если вы уже сохраняете объекты в памяти; у вас нет накладных расходов на обертку, вам не нужно вручную искать объекты, и вы можете напрямую выполнять операции «Collection». «Multimap» * почти точно эквивалентен «Map>» с некоторыми дополнительными методами удобства. –
chrylis