2015-03-31 47 views
2

我有兩個ArrayList的一個& B都ArrayList的大小更多的則是50000。我想對它們進行比較,並從一個ArrayList中刪除B和添加剩餘對象爲新的ArrayList℃。比較,並創造新的ArrayList

我的代碼是在這裏:

c = new ArrayList<String>(a); 
c.removeAll(b); 

,我也試試這個代碼

for (int i = 0; i < a.size(); i++) { 
    if (!b.contains(a.get(i))) { 
     c.add(a.get(i)); 
    } 
} 

都比較過程正在採取大量的時間。

如何解決和優化這個問題。

+3

你需要使用的ArrayList,或者你可以使用另一個容器?例如一套。 – khelwood 2015-03-31 13:36:10

+0

不,我只需要使用Arraylist,因爲在創建Arralist之後,我需要傳遞其他類並再次進行比較過程並顯示到列表視圖中。 – 2015-03-31 13:40:25

+0

正如@khelwood所寫,另一個容器可能會對您有所幫助,因爲兩個示例代碼均以N^2運行,在這種情況下,將執行50000 * 50000次比較。如果你至少把'b'變成'Set'(例如'HashSet'),'b.contains()'將是恆定時間,所以性能應該會提高。 – dnet 2015-03-31 13:46:00

回答

0

這是這樣的問題

完美的解決方案,我有三個ArrayList的A,B &Ç

ArrayList的大小= 25000,B = 20000

現在我想刪除b從一個如果我試圖從第二個使用for循環刪除一個數組然後我有應用程序卡住的問題,所以這裏是解決方案從第二數組中刪除一個數組:

ArrayList<String> A = new ArrayList<String>(); 
ArrayList<String> B = new ArrayList<String>(); 
ArrayList<String> C; 

Set<String> setA = new HashSet<String>(A); 
Set<String> setB = new HashSet<String>(B); 
setA.removeAll(setB); 

c = new ArrayList<String>(setA); 

使用設置,你可以輕鬆地刪除從另一個陣列陣列沒有卡住的問題,也是過程更快然後循環

0

而不是使用ArrayLists的,請嘗試使用SparseArrays

初始化:

當您填充既是& B,而不是與ArrayLists做這種方式:

String newItem = "sample"; 
a.add(newItem); 

待辦事項它SparseArray這樣的:

String newItem = "sample"; 
a.put(newItem.hashCode(), newItem); 

同去用b。

迭代:

// c can still be an array list 
ArrayList<String> c = new ArrayList<String>(); 
int key; 
for (int i = 0; i < a.size(); i++) 
{ 
    key = a.keyAt(i); 
    if (b.indexOfKey == -1) 
    { 
     c.add(a.get(key)); 
    } 
} 

你的代碼性能:O(|a| * |b|)或者,如果|a| = |b|O(|a|^2),這意味着如果既& b具有約50000項,將有總計25億次迭代(2.5十億)。

此代碼的性能會O(|a|),這意味着如果有大約50,000項,將有總共50000次迭代。

你應該注意到,雖然這種方法的時間複雜性要好得多,在空間複雜性是差了很多,因爲這種方法比分配你的方法更多的內存。

0
please try the below example, I think it should resolve your issue 

    public static void main(String a[]){ 

     List a1 = new ArrayList<>(); 
     List b = new ArrayList<>(); 
     List c = new ArrayList<>(); 

     a1.add("1"); 
     a1.add("2"); 
     a1.add("3"); 
     a1.add("4"); 
     b.add("2"); 
     b.add("3"); 
     c.addAll(a1); 
     System.out.println("a :::: " + c + " :::: b ::: " + b); 
     c.removeAll(b); 
     System.out.println("a :::: " + c + " :::: b ::: " + b); 
    } 
+0

這個比較過程花費了很多時間。 – 2015-04-01 04:30:54

0

你可以這樣使用。

public static ArrayList<String > getDifference(ArrayList<String> arraylistprevious,ArrayList<String> arraylistnew) 
    { 
    ArrayList<String> temp=null; 
     try { 



       temp = new ArrayList<String>(); 
       temp.addAll(arraylistnew); 
       temp.removeAll(arraylistprevious); 

       System.out.println("temp List: " + temp); 
     } catch (Exception e) { 
      // TODO: handle exception 
     } 




    return temp; 

    }