我正在尝试编写一个方法,它接受2个双精度数组列表并返回set1中找不到的所有值。这些数字应该在set3中返回。我不断收到内存错误。有人能指出我正确的方向吗?
ArrayList<Double> setDiff(ArrayList<Double> set1, ArrayList<Double> set2){
ArrayList<Double> set3 = new ArrayList<Double>();
int count = 0;
while(count < set1.size()){
boolean inList = false;
while(inList == false){
int count2 = 0;
while(count2 < set2.size() && set1.get(count) == set2.get(count2)){
count2++;
}
if(count2 != set2.size()){
set3.add(set1.get(count));
}
else{
inList = true;
count++;
}
}
}
return set3;
}
答案 0 :(得分:2)
我建议使用Collection utils Disjunction
返回包含独占析取的Collection(对称 给定集合的差异。
返回的Collection中每个元素e的基数将是 等于max(基数(e,a),基数(e,b)) - 分钟(基数(即,a)中,基数(E,B))。
这相当于减去(union(a,b),intersection(a,b))或 联盟(减去(A,B),减(B,A))。
答案 1 :(得分:2)
有些循环很可能没有像你期望的那样停止。
以下代码片段与您尝试的完全相同。
for (Double d : set1) {
if (!set2.contains(d)) {
set3.add(d);
}
}
更新:既然你说你不能使用contains(),你可以自己执行检查:
for (Double d : set1) {
boolean found = false;
for (int i=0; i<set2.size() && !found; i++) {
if (d.equals(set2.get(i))) {
found = true;
}
}
if (!found) {
set3.add(d);
}
}
编辑:此外,代码中的问题在于
行 if(count2 != set2.size()){
您应该使用&gt;更改!=,因为在count2小于set2的情况下,外部计数变量不会增加,导致无限循环,并在几秒后出现OutOfMemoryError。
此外,您的算法也不是100%正确,因为循环通过第二个列表不一致。您可以在下面看到类似的while循环方法:
int count = 0;
while (count < set1.size()) {
boolean inList = false;
int count2 = 0;
while (inList == false && count2 < set2.size()) {
if (set1.get(count).equals(set2.get(count2))) {
inList = true;
}
count2++;
}
if (!inList) {
set3.add(set1.get(count));
}
count++;
}
答案 2 :(得分:2)
在做这些comaprisons之前对列表进行排序可能是有利的,然后可以更有效地执行搜索项目。
您也可以尝试这样做:
set1.removeAll(set2)
set1中剩余的项目是不在set2中的项目