我有两个ArrayList a& b两个ArrayList大小都超过50000.我想比较它们并从a和Add Remaining对象中删除ArrayList b到新的ArrayList c。
我的代码就在这里:
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));
}
}
两个比较过程都花费了很多时间。
如何解决和优化此问题。
答案 0 :(得分:0)
请尝试使用ArrayLists
:
SparseArrays
初始化:
当您同时填充&amp; 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)
,这意味着如果同时使用&amp; b有大约50,000个项目,总计将有2,500,000,000次迭代(25亿次)。
此代码的性能为O(|a|)
,这意味着如果a有大约50,000个项目,则总共会有50,000次迭代。
您应该注意,虽然此方法的 时间 复杂性要好得多,但 空间 的复杂性是更糟糕的是,因为这个方法分配的内存比你的方法多得多。
答案 1 :(得分: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);
}
答案 2 :(得分: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;
}
答案 3 :(得分:0)
对于像这样的问题,这是完美的解决方案
我有三个ArrayList a,b&amp; c
ArrayList a size = 25000,b = 20000
现在我想从a中删除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);
使用set可以轻松地从另一个数组中删除数组而不会出现问题,并且进程也比循环
更快