Вопрос по android, arrays – Android: поиск из большого Arraylist

4

У меня есть набор записей около 29 000 записей. Мой экран содержит текстовое поле EditText для критериев поиска и список, содержащий все 29 000 записей.

Поиск по указанному пути требует времени и не дает потока меньше выхода, как мне нужно.

Мой EditText содержит

final EditText txtSearchCity = (EditText) findViewById(R.id.edtCity);
        txtSearchCity.addTextChangedListener(new TextWatcher() {
            @Override
            public void afterTextChanged(Editable s) {
            }

            @Override
            public void beforeTextChanged(CharSequence s, int start, int count,
                    int after) {
            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before,
                    int count) {
                aCountryIDTemp.clear();
                aCityStateTemp.clear();

                for (int i = 0; i < aCountryID.size(); i++) {
                    if (aCityState
                            .get(i)
                            .toLowerCase()
                            .contains(
                                    txtSearchCity.getText().toString()
                                            .toLowerCase())) {
                        aCountryIDTemp.add(aCountryID.get(i));
                        aCityStateTemp.add(aCityState.get(i));
                    }
                }

                BindList();
            }
        });
    }

Метод BindList () устанавливает массив списков aCityStateTemp для адаптера. Любой другой способ поиска и создания нового ArrayList динамически.

Лучше использовать базу данных и выполнять запрос LIKE при изменении текста редактирования текста. Dharmendra
@ Vishal Khakhkhar Я использую пользовательскую клавиатуру для ввода текста редактирования, но у меня задержка при нажатии кнопки быстрее, у меня более 1000 записей. Как я могу улучшить, пожалуйста, помогите Sagar
@ Дармдра делала то же самое вместо этого .. но брала то же самое время .. Vishal Khakhkhar

Ваш Ответ

4   ответа
2

Вы можете использовать HashSet или LinkedHashSet (сохраняет порядок вставки) для быстрого поиска. С содержит () метод этих классов.

0

Вы можете сохранить все данные в базе данных sqlite и получить искомый элемент, используя запрос типа «Мне нравится».

Error: User Rate Limit Exceeded Vishal Khakhkhar
1

Я бы предположил, что вы прошлиaCityStateTemp тебеAdapter какArrayList при инициализацииAdapter

Теперь после изменения содержимогоaCityStateTempнужно просто позвонитьadapter.notifyDataSetChanged(), Вам не нужно устанавливатьaCityStateTemp адаптировать как новыйArrayList.

Error: User Rate Limit Exceeded Vishal Khakhkhar
14

Я бы настаивал на использованииLambdaj  Библиотека, которая в основном используется в тех случаях, когда вы хотите ограничить циклы для сортировки и фильтрации коллекций.

Вот небольшой пример использования lambdaj для фильтрацииArrayList.

ArrayList<String> sortedArrayList = select(arrList, having(on(String.class),
                                                   Matchers.containsString("a");

Это вернет полный отфильтрованныйArrayList с которой вы хотите заполнить свойListView.

Вы также можетеfilter Пользовательские классы -Java: What is the best way to filter a Collection?

UPDATE:

Выше решение былоcase-sensitive так что обойти можно добавитьMultiple Matchers.

Как это вы можете добавитьMultiple Matchers,

ArrayList<String> sortedArrayList = select(arrList, having(on(String.class),
   (Matchers.anyOf(Matchers.containsString("a"),Matchers.containsString("A")))));

UPDATE:

Еще лучше использоватьfilter(Matcher<?> matcher, T...array)

Вот как вы можете это сделать,

ArrayList<String> sortedArrayList = filter(Matchers.anyOf(
           Matchers.containsString("a"),Matchers.containsString("A")), arrList);

Кроме того, если вы заинтересованы в использовании некоторых методов / возможностейlambdajВы можете извлечь исходный код и заставить его работать. Я добавляю то же самое дляfilter()

Вы можете просто скачатьhamcrest-all-1.0.jar(63 kb) и добавьте код ниже, чтобы получитьfilter() за работой

public static <T> List<T> filter(Matcher<?> matcher, Iterable<T> iterable) {
    if (iterable == null)
        return new LinkedList<T>();
    else{
        List<T> collected = new LinkedList<T>();
        Iterator<T> iterator = iterable.iterator();
        if (iterator == null)
            return collected;
        while (iterator.hasNext()) {
            T item = iterator.next();
            if (matcher.matches(item))
                collected.add(item);
        }
        return collected;
    }
}

Таким образом, вы можете просто отсортировать наименьшее изlambdaj источник и интегрировать в ваш источник.

Error: User Rate Limit Exceededstackoverflow.com/a/16528057/1276636
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Vishal Khakhkhar

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