2015-03-31 48 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; 

    }