Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Android: Búsqueda de Arraylist grande

Tengo un conjunto de registros de unos 29.000 registros. Mi Pantalla contiene el cuadro EditarTexto para Criterios de búsqueda y ListView que contiene todos los 29.000 registros.

Al buscar con la forma listada se necesita tiempo y no dar flujo de salida menos que necesito.

Mi EditarTexto contiene

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 () método está estableciendo el arraylist aCityStateTemp al adaptador. Cualquier otra forma de buscar y crear nuevo ArrayList dinámicamente.

  • Convertir lista a matriz en Java
  • Eliminando un elemento de String array en android
  • Android: Cómo rellenar una vista de lista con elementos de matriz
  • ClassCastException: java.lang.Object no se puede convertir en java.lang.String android
  • Excepción lanzada durante TypedArray # getTextArray ()
  • ¿Cómo puedo agregar datos que he introducido en un cuadro de EditText en una matriz para enumerar en otra actividad?
  • ListView dinámico en Android Studio: Selección de elemento aleatorio y vista de lista de actualizaciones
  • 4 Solutions collect form web for “Android: Búsqueda de Arraylist grande”

    Insistiría en usar la biblioteca de Lambdaj que se utiliza sobre todo en casos donde usted quiere restringir los lazos para clasificar y filtrar colecciones.

    Aquí hay un pequeño ejemplo para usar lambdaj para filtrar ArrayList .

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

    Esto devolverá un ArrayList filtrado completo con el que desea rellenar su ListView .

    También puede filter Custom Classes – Java: ¿Cuál es la mejor manera de filtrar una colección?

    ACTUALIZAR:

    Por encima de la solución era case-sensitive a case-sensitive así que para trabajar en torno a usted puede agregar Múltiples Matchers .

    Así, usted puede agregar Multiple Matchers ,

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

    ACTUALIZAR:

    Incluso mejor manera es utilizar filter(Matcher<?> matcher, T...array)

    Aquí es cómo usted puede hacer eso,

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

    Además, si está interesado en utilizar algunos de los métodos / características de lambdaj , puede extraer la fuente y hacerlo funcionar. Estoy agregando lo mismo para filter()

    Puedes descargar hamcrest-all-1.0.jar(63 kb) y añadir debajo del código para que el filter() funcione

     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; } } 

    Por lo tanto, sólo puede ordenar a menos de lambdaj fuente e integrar en su fuente.

    Puede utilizar HashSet o LinkedHashSet (mantiene el orden de inserción) para una búsqueda rápida. Con el método contains () de esas clases.

    aCityStateTemp que usted ha pasado aCityStateTemp al Adapter como ArrayList mientras que inicializa el Adapter

    Ahora, después de cambiar el contenido de aCityStateTemp , sólo tiene que llamar a adapter.notifyDataSetChanged() . No es necesario establecer el aCityStateTemp al adaptador como nuevo ArrayList .

    Puede almacenar todos los datos en una base de datos sqlite y recuperar el elemento buscado utilizando la consulta similar.

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.