Эффективно отфильтруйте ArrayList в Java/Android

Я разрабатываю приложение для Android (Android 1.6), но это - вероятно, более общий вопрос о Java.

У меня есть ArrayList приблизительно 10 000 объектов

объекты содержат 3 строки (firstName, middleName, lastName).

Пользователю дарят "поле поиска" на андроиде, где они могут искать конкретный "объект" путем ввода в части имени.

У меня есть класс (который я называю Filterer), который перерывает список 10,000 для соответствующих объектов и затем возвращает их как "подсписок".

Поиск является НЕМНОГО МЕДЛЕННЫМ (особенно на телефоне на базе Android), и я уверен, что не делаю поиска/просачивания самый эффективный возможный способ.

У кого-либо есть какие-либо предложения о том, как ускорить мой поиск? Мой код ниже. Одна возможность к искать против вторичного "masterList", который уже имеет каждую информацию в нижнем регистре и связанном …, но может быть дополнительными способами улучшить этот поиск, который также помог бы.

TIA!!

public void filterNames() {
  this.filteredList.clear();
  String sv = this.searchString.toString.trim().toLowerCase(); // search value
  for (int i = 0; i < this.masterList.size(); i++) {
    MyObject d = this.masterList.get(i);
    String fn = d.getFirstName().toString().toLowerCase();
    String mn = d.getMiddleName().toString().toLowerCase();
    String ln = d.getLastName().toString().toLowerCase();

    if (fn.indexOf(sv) >= 0 || 
        md.indexOf(sv) >= 0 || 
        ln.indexOf(sv) >= 0) {
      this.currentList.add(d);
    }
  }
}
11
задан Branislav Abadjimarinov 18 March 2011 в 14:16
поделиться

4 ответа

Да, конечно, больно опускать несколько объектов в нижний регистр для каждой итерации цикла (плюс, возможно, избыточное toString?), а также плохая практика вызывать list.size() для каждой итерации - это значение должно быть кэшировано перед началом цикла.

В любом случае, если вы работаете с таким количеством данных, есть ли причина, по которой вы не используете базу данных SQLite для хранения и отображения/фильтрации списка с помощью CursorAdapter?

Это был бы рекомендуемый способ реализации чего-то такого размера.

7
ответ дан 3 December 2019 в 10:44
поделиться

Не забывайте, что, поскольку родителем cron является init, он запускает программы без управляющего терминала. Вы можете смоделировать это с помощью такого инструмента:

http://libslack.org/daemon/

-121--580069-

Нет такой возможности в об/мин. Требовать виртуальный обеспечивает, что пакеты имеют общий, если он есть.

-121--3242485-

Может быть, вы можете обменять место на некоторую скорость? Создайте какую-либо форму индекса для ваших данных?

Например:

  1. Создайте список для каждого символа (a-z) со всеми «MyObject», где часть имени содержит символ (помните о специальных символах!). Для каждой записи подсчитывается количество «MyObject» s
  2. Если пользовательский тип в запросе, ищите отдельные символы и ищите только список с наименьшим количеством записей.

Разумеется, добавление имени потребует добавления его в индекс.

2
ответ дан 3 December 2019 в 10:44
поделиться

После исследования немного больше я обнаружил, что суффиксные массивы могут получить вам постепенные ответы. Также взглянуть на вступление в Википедию для деревьев суффикс для немного более подробного объяснения.
Besdies, которые я согласен с ответом выше , что вы, вероятно, можете использовать базу данных SQL для таких запросов. Выполнение запроса SQL по данным, вероятно, является одним из самых быстрых способов получить то, что вы хотите без массивов суффикса.
Одна вещь, чтобы ускорить вещи немного, не делая SQL, было бы поставить имя, Middlename, фамилия в одну строчную строку и поместите это на новую карту, которая ссылается на индекс массива. Таким образом, вы можете уменьшить поиск всего на 10 000 строк хэшмапа, не занимаясь строчными буквами каждый раз. Это может быть немного быстрее, но, конечно, требует большего количества памяти. Может быть, попробуйте сделать что-то с регулярными выражениями, чтобы ускорить соответствие.
Другой вариант будет на самом деле создать поиск поиска с чем-то вроде Lucene , хотя я думаю, что это будет действительно излишек на устройстве Android, но может работать в простых Java и Infix Search в Lucene не является супер высокой производительностью Отказ

0
ответ дан 3 December 2019 в 10:44
поделиться

Как вы изначально извлекаете список 10 000+? Если вы просто используете экземпляр SQLite , я бы очень, настоятельно рекомендую сделать это в SQL.

-1
ответ дан 3 December 2019 в 10:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: