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


¿Cómo comparar dos arraylist?

Tengo dos ArrayList . Cada uno es de tamaño 100000. Quiero compararlos y contar elementos emparejados.

Aquí está mi código:

 for (int i = 0; i < mArryLst2.size(); i++) { if (ArryLst1.contains(mArryLst2.get(i))) { matchedPixels++; } } 

Aquí el proceso de comparación está tomando mucho tiempo.

Cómo resolver y optimizar este problema.

  • Sqlite en Android: Cómo crear una función sqlite dist db - que se utilizará en la aplicación para calcular la distancia utilizando lat, largo
  • ¿Estancado en la pantalla del emulador en Eclipse con Android Development?
  • ¿Cómo obtener el índice actual de la pestaña seleccionada en TabLayout?
  • Class Dimension para java en android
  • Intención de difusión cancelada. GCM de Android
  • ¿Cómo especificar el tamaño correcto del diálogo en el archivo de disposición XML para el diálogo de Android?
  • Cabecera Content-Length ya presente
  • Exportación y ejecución del proyecto Unity3D a Android Studio
  • 8 Solutions collect form web for “¿Cómo comparar dos arraylist?”

    Debe usar CollectionUtils.retainAll : Devuelve una colección que contiene todos los elementos de collection1 que también están en collection2.

     ArrayList commonList = CollectionUtils.retainAll(list1,list2); 

    Usted debe transformar su primera lista en un HashSet. Las búsquedas de HashSet son O (1), y las búsquedas de lista son O (n). Esto hace que todo el algoritmo O (n) en lugar de O (n ^ 2)

     Set<Foo> set1 = new HashSet<Foo>(list1); for (Foo foo : list2) { if (set1.contains(foo)) { matchedPixels++; } } 

    Usted debe mirar este acoplamiento ¿Cómo comparar dos valores de Arraylist en java? . Hacer una copia de una de la lista y luego llamar eliminar todos para la lista contra la otra lista

     List result = new ArrayList(mArryLst2); result.removeAll(ArryLst1); 

    La mejor opción es poner todos los elementos de su 1ra ArrayList en un sistema (permite solamente elementos únicos).
    Ahora, desde la segunda ArrayList, agregue cada elemento a su Set, si el elemento ya existe en su conjunto, entonces devolverá false.

    Si tiene 2 arrayLists ArrayList1 y ArrayList2 y desea que todas las coincidencias en otro ArrayList Diff

     HashSet hs = new HashSet(); for(int i : ArrayList1) hs.add(i); for(int i : ArrayList2) { if(!hs.add(i)) Diff.add(i); } 

    Será más rápido pienso

      Set set = new HashSet(); set.addAll(ArryLst1); for (int i = 0; i <mArryLst2.size(); i++) { if (set .contains(mArryLst2.get(i))) { matchedPixels++; } } 

    Hay un par de maneras de acelerar esto (especialmente para matrices grandes) y simplificar el código;

      // Quick Check to see if the two arrayLists have the same number of elements if (array1.size() != array2.size()) return false; // Optionally Sort the arrays - avoid returning false if the elements are the same but // have been stored out of sequence Collections.sort(array1); Collections.sort(array2); if (array1.hashCode() == array2.hashCode()) { return true; } else { return false; } 

    La mejor manera de hacerlo es Anular el método de iguales y comprobar si cada objeto de la lista de matrices es igual o no.

      public class CustomClass { String x; String a; String b; String c; long l; @Override public boolean equals(Object obj) { return (this.blindlyEquals(obj) && ((CustomClass) obj).blindlyEquals(this)); } protected boolean blindlyEquals(Object o) { if (!(o instanceof CustomClass)) return false; CustomClass p = (CustomClass)o; return (px == this.x && pa == this.a && pb == this.b && pc == this.c && pl == this.l); } } public class MainClass { ArrayList<CustomClass> member = new ArrayList<CustomClass>(); ArrayList<CustomClass> server; /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub MainClass mainClass = new MainClass(); mainClass.server = mainClass.getServerList(); mainClass.member = mainClass.getLocalList(); if(mainClass.member.equals(mainClass.server)){ System.out.println("true"); //do the needfull, run a for loop to check which object is not equal }else{ System.out.println("false"); //do the needfull, run a for loop to check which object is not equal } } public ArrayList<CustomClass> getServerList(){ ArrayList<CustomClass> server = new ArrayList<CustomClass>(); CustomClass obj = new CustomClass(); CustomClass obj2 = new CustomClass(); obj.a = "ali"; obj.b = "ball"; obj.c = "cat"; obj.x = "xerox"; obj.l = 10; obj2.a = "ali"; obj2.b = "ball"; obj2.c = "cat"; obj2.x = "xerox"; obj2.l = 10; server.add(obj); server.add(obj2); return server; } public ArrayList<CustomClass> getLocalList(){ ArrayList<CustomClass> memberOne = new ArrayList<CustomClass>(); CustomClass obj = new CustomClass(); CustomClass obj2 = new CustomClass(); obj.a = "ali"; obj.b = "ball"; obj.c = "cat"; obj.x = "xerox"; obj.l = 10; obj2.a = "ali"; obj2.b = "ball"; obj2.c = "cat"; obj2.x = "xerox"; obj2.l = 10; memberOne.add(obj); memberOne.add(obj2); return memberOne; } } 

    Puedes usar

     ArrayList Listname = ListUtils.retainAll(list1,list2); 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.