2013-10-27 2 views
0

У меня есть ArrayList MyObjects. Класс MyObjects имеет более 10 объектов, но мне нужно искать только 4 свойства. Пользователь нажмет кнопку и сможет выбрать значения для property1. Допустим, пользователь выберет property1Value1, property1Value2 и property1Value4, чем он нажмет кнопку и сделает выбор для property2 значений: property2Value1, property2Value5, property2Value7 и так далее. Это фильтр1 и фильтр2. property2Value2, property2Value3 и property2Value4 не отображается для пользователя, потому что он отфильтровывался с фильтром1. Это похоже на поиск, прежде чем он войдет в новый экран фильтра. Мне нужно где-то хранить то, что он выбрал в каждом фильтре, потому что, когда он перемещается назад, я должен показать ему выбранные значения.поиск объектов в памяти

Я думаю, легче понять, с фотографиями, так похожи реализованы на Ebay:

на начало Нет фильтров: пользователь может выбирать все значения для каждого свойства: no filters

пользователь выбрал «Tablet» для свойства типа. - поиск производится и некоторые значения свойств не видно больше:

tablet

выбирается второе значение фильтра:

tabtype

Нажатие (автоматически) поиск я должен сделать что-то как в 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 ... может быть, с несколькими вспомогательными коллекциями меньше.

Любая идея?

+1

«Multimap» * лучше, чем карта в поле ID, если вы уже сохраняете объекты в памяти; у вас нет накладных расходов на обертку, вам не нужно вручную искать объекты, и вы можете напрямую выполнять операции «Collection». «Multimap» * почти точно эквивалентен «Map >» с некоторыми дополнительными методами удобства. – chrylis

ответ

1

Что вы говорите, это в основном индексация. Подобный подход к тому, что вы описываете, отлично управляется на Java, он просто берет ту же осторожную кодировку, что и в Objective C.

Вы не указали много вопросов о том, разрешено ли нескольким элементам иметь одинаковые значения в своих полях, поэтому я предполагаю, что они есть. В таком случае, вот как я бы начал:

  • Использование гуава-х Multimap, вероятно HashMultimap, где ключевым является имущество, являющийся индекс и каждый объект индексируется получает put в карту под этим ключом.
  • Когда вы пытаетесь произвести поиск по нескольким полям, звоните multimap.get(property) получить Collection все объекты, которые соответствуют этому свойству и сохранить только те объекты, которые соответствуют всем свойствам:

    Set<Item> items = new Set<Items>(typeMultimap.get("tablet")); 
    items.retainAll(productLineMultimap.get("Galaxy Tab")); 
    // your results are now in "items" 
    
  • Если вашему список свойств стабилен, напишите обертку Indexer класс, который имеет поля для всех Multimap s и гарантирует, что объекты вставляются и удаляются из всех индексов свойств и, возможно, имеют удобства для карт-геттеров.
+0

+1 спасибо, я проверю Multimap, никогда не использовавшийся ранее. Отредактировал вопрос, чтобы быть более ясным: мне нужно переписать этот SQL для поиска в Collection. Точно как ebay делать с sql –

+0

Что вы думаете о моем решении? –

0

Как он выполняет MYSQL, что SQL позади сцены? - В таблице MyISAM есть файл, в котором у него есть данные, в другом файле указаны позиции id.

SELECT * FROM mytable поместит все ID в результирующий набор, потому что фильтра нет. Потому что * будет скопировать все поля в id. Это эквивалентно:

ArrayList<MyObject> result = new ArrayList<MyObject>(); 
for(int i=0; i < listMyObjects.size(); i++){ 
    if(true == true){// SELECT * FROM has a hidden WHERE 1, which is always true 
     result.add(listMyObjects.get(i)); 
    } 
} 

в случае фильтра он должен иметь список фильтров:

ArrayList<String> filterByProperty1 = new ArrayList<String>(); 

в интерфейсе фильтра я добавлю некоторые строки property1Value1, property1Value2 .... алгоритм поиска его будет:

ArrayList<MyObject> result = new ArrayList<MyObject>(); 
    for(int i=0; i < listMyObjects.size(); i++){ 
      MyObject curMyObject = listMyObjects.get(i); 
      // lets see if bypass the filter, if filter exists 
      boolean property1Allow = false; 
      boolean property2Allow = false; 
      if(filterByProperty1.size() > 0){ 
       String theCurProperty1Value = curMyObject.getProperty1(); 
       if(filterByProperty1.contains(theCurPropertyValue)){ 
        property1Allow = true; 
       } 
      } 
      else{// no filter by property1: allowed to add to result 
       property1Allow = true; 
      } 

      // do the same with property2,3,4, lazzy to write it 

      if(property1Allow && property2Allow){ 
       result.add(theCurPropertyValue); 
      } 
     } 
    } 

Не уверен, если это намного медленнее, но я хотя бы я бежал с десятого/сотни вспомогательных коллекций индексов. После этого я сделаю необходимые дополнительные вещи и сделаю

+0

Похоже на то, что у него не хватало уверенности в производительности. Я предлагаю попробовать намного более простой механизм фильтрации, а затем только попробовать что-то вручную, если вы можете указать, где именно происходит замедление. – chrylis

Смежные вопросы