Перебор огромного списка - лучший альтернативный подход - PullRequest
0 голосов
/ 04 ноября 2018

У меня есть текстовый ввод, где пользователи вводят поисковое слово, я разбиваю это поисковое слово на строковый массив слов, выполняю поиск по названию и описанию элементов списка, используя эти поисковые слова. Вот мой код, но он работает очень медленно на моих устройствах. (Я дважды проверил, что медлительность из цикла for each, а не RecyclerView). Кто-нибудь может мне предложить хороший пример лучшей / более быстрой альтернативы?

ArrayList<CustomItem> original_list = getListFromDatabase();
    ArrayList<CustomItem> filtered_list = new ArrayList<>();

    String input_word = search_word.trim().toLowerCase(); // search_word is assigned by an input field
    String[] parts = input_word.split(" ");

    if (original_list != null) {
        for (CustomItem item : original_list) {
            int number = 0;
            for (String part : parts) {

                if (item.getName().toLowerCase().contains(part) || item.getDescription().toLowerCase().contains(part)) {
                    ++number;
                }
            }
            if (number == parts.length) filtered.add(item);
        }
    }

    // lastly I assign my filtered list to a RecyclerView

    if (adapter != null) adapter.search(filtered);

Ответы [ 2 ]

0 голосов
/ 04 ноября 2018

Может быть, вы можете рассмотреть параллельный поток и проверить разницу в производительности. Поскольку реализованная вами функциональность действительно нуждается в любой последовательности заказа для обработки ..

original_list.parallelStream()... 

после этого либо отфильтруйте, либо сделайте forEach .. как хотите.

Надеюсь, это поможет. Ура !!!

0 голосов
/ 04 ноября 2018

Есть несколько простых вещей, таких как: вы звоните toLowerCase() несколько раз для каждого предмета. Вы должны сделать это один раз перед этим внутренним циклом!

Но кроме этого, остается не так много, как (потенциальное) использование нескольких потоков для параллельной обработки нескольких частей ваших данных. Но это не поможет на небольших устройствах с медленными процессорами.

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

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

Итак, очевидно, есть много вариантов, и что вы должны сделать, зависит от вашего контекста, требований и ресурсов!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...