2011-12-21 33 views
7

İki tane ArrayList ürünüm var. Her biri 100000 ebadındadır. Onları karşılaştırmak ve eşleştirilen öğeleri saymak istiyorum.İki arraylist nasıl karşılaştırılır?

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

karşılaştırma işlemi çok zaman alıyor:

İşte benim kod.

Bu sorun nasıl çözülür ve en iyi duruma getirilir.

+1

kolayca nesneleri karşılaştırmak kullanabilirsiniz. –

+0

Dizi listesi öğelerinin türleri nelerdir? – fge

+1

Ayrıca, öğeleri benzersiz mi? Öyle görünüyor. Eğer öyleyse, bir 'ArrayList' değil' HashSet' kullanmalısınız. – fge

cevap

10

Eğer CollectionUtils.retainAll kullanmak gerektiğini düşünüyorum hızlı olacaktır listenin birinin bir kopyasını yapmak ve daha sonra diğer listesine göre liste için tüm kaldırmak çağırır: Bütün içeren bir koleksiyon döndürür koleksiyonda1 bulunan koleksiyon1 içindeki öğeler2.

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

Ortak öğelere veya yalnızca bunların sayısına erişmeleri gerekiyor mu? – helios

+0

plx-collections.jar dosyasında bulabileceğiniz – chopss

+0

kavanoz dosyası için linke tıklayabilirsiniz. Bunu indirmek için site sayısı çok vardır. –

5

İlk listeyi bir HashSet'e dönüştürmelisiniz. HashSet aramaları O (1) ve Liste aramaları O (n). Bütün bu algoritma O (n) yerine O yapar (n^2)

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

ArrayList'ten HashSet'e bir dönüşüm, – fyr

+2

değil ne? OP, listenin bir öğe içerip içermediğini kontrol etmek ister. İçerdiği takdirde, set içerecektir. Eğer içermiyorsa, set içermez. –

+0

Ops yönteminin sonuçları, HashSets'i bu noktada kullanırsa sonuçlardan farklı olabilir. – fyr

0

iyi seçenek (sadece benzersiz unsurları sağlar) bir Set halinde 1 ArrayList tüm unsurları yerleştirmek.
Şimdi, 2. ArrayList öğesinden, öğenizi kümenizde zaten varsa, her bir öğeyi Setinize ekleyin, sonra false döner.

size 2 Dizi Listeleri ArrayList1 ve ArrayList2 varsa ve başka ArrayList Diff

HashSet hs = new HashSet(); 

for(int i : ArrayList1) hs.add(i); 

for(int i : ArrayList2) 
{ 

if(!hs.add(i)) 
    Diff.add(i); 

} 
0

bu i

Set set = new HashSet(); 
    set.addAll(ArryLst1); 

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

Bunu hızlandırmanın birkaç yolu vardır (özellikle büyük diziler için) ve kodu sadeleştirin;

// 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; 
    } 
+0

İki ArrayLists dizisinin1 ve dizinin2, aynı karma kodu, o zaman ** yanlış **! –

+0

Ayrıca sıralama, yalnızca öğelerden (OP'nin bahsetmediği) tam bir düzen varsa yardımcı olur, bu durumda diğerinde bir ArrayList öğesinin öğelerini bulmak için ikili bir arama kullanabilirsiniz. Bunun için sadece birini sıralamak zorunda kaldınız. –

0

Yapmanın en iyi yolu, eşitleme yöntemini geçersiz kıl ve dizi listesindeki her nesnenin eşit olup olmadığını kontrol etmektir.

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 (p.x == this.x && p.a == this.a && p.b == this.b && p.c == this.c && p.l == 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; 
     } 
    } 
0

Sen bir listesi/ArrayList yerine bir ayarla/HashSet kullanmalıdır,

ArrayList Listname = ListUtils.retainAll(list1,list2); 
+2

“ListUtils” in Android yerel sınıfı olmadığını belirtmelisiniz. Apache ortak-koleksiyonlarından. –

İlgili konular