我正在尝试编写一个方法,该方法采用 2 个双精度数组列表并返回 set1 中在 set2 中找不到的所有值。这些数字应在 set3 中返回。通常我只会使用 set.contains,但我只能使用 set.get set.size 和 set.add。谁能指出我正确的方向?
例如:
如果 set1 有数字 1,2,3,4,5
和 set2 有数字 1,7,9,5,3
set3 应仅包含 2,4,5
ArrayList<Double> setDiff(ArrayList<Double> set1, ArrayList<Double> set2){
ArrayList<Double> set3 = new ArrayList<Double>();
for(int i = 0; i < set1.size(); i++){
for(int x = 0; x < set2.size(); x++){
if(set1.get(i) != set2.get(x)){
set3.add(set1.get(i));
}
}
}
return set3;
}
问题是,您根据第一次失败将数字添加到set3
。因此,如果set2
的第一个元素与set1
的当前元素不匹配,则将其添加到set3
中。
鉴于工具包中的限制,我怀疑这是您的家庭作业。所以,我只是给你一个如何处理的想法。
您可以使用 boolean
变量,并在set2
中找到当前元素后立即切换它(例如将其设置为 false
),然后脱离inner loop
。
因此,您在内循环中的条件将从:-
if(set1.get(i) != set2.get(x))
自:-
if(set1.get(i) == set2.get(x)) {
// The current element in set1 is present in set2.
// toggle the boolean variable
// break out of loop. As you no more want to check for further elements.
}
然后在inner loop
外部,检查该boolean
变量的状态。并且根据状态,您可以添加或不将当前项目添加到set3
。例如,如果布尔变量是false
,这意味着你在set2
中找到了该元素,所以不要将其添加到set3
,否则添加它。
您还需要每次在外部循环开始时重置布尔变量。
您可以尝试使用 Apache commons CollectionUtils.removeAll 方法:此方法返回一个集合,其中包含 c 中所有不在 remove 中的元素。
ArrayList commonList = CollectionUtils.removeAll(arrayList1, arrayList2);
试试
static ArrayList<Double> setDiff(ArrayList<Double> set1, ArrayList<Double> set2) {
ArrayList<Double> copy1 = (ArrayList<Double>) set1.clone();
copy1.retainAll(set2);
ArrayList<Double> copy2 = (ArrayList<Double>) set1.clone();
copy2.removeAll(copy1);
return copy2;
}
public static void main(String[] args) throws Exception {
ArrayList l1 = new ArrayList(Arrays.asList(1.0, 2.0, 3.0, 4.0, 5.0));
ArrayList l2 = new ArrayList(Arrays.asList(1.0, 7.0, 9.0, 5.0, 3.0));
System.out.println(setDiff(l1, l2));
}
指纹
[2.0, 4.0]
此外,我建议将方法签名更改为
<T> List<T> listDiff(List<T> list1, List<T> list2)