我有一个名为Task
的课程,我无法触及,因为它是遗留代码,我有两个由ArrayList
类组成的Task
我需要比较。项目可以是任何顺序,也可以在ArrayList中有重复项。
比较两个具有对象的ArrayList
并打印出缺少的元素的最佳方法是什么,这些元素在列表中不存在。下面的代码是正确有效的方法吗?我不能使用任何外部库。
我需要以双向比较来比较我的两个数组列表。
以下是我的代码:
public static boolean compare(List<Task> source, List<Task> actual) {
List<Task> matchedTasksList = new ArrayList<Task>();
List<Task> differedTasksList = new ArrayList<Task>();
List<Task> copyOfSource = new ArrayList<>(source);
List<Task> copyOfActual = new ArrayList<>(actual);
for (Task o : actual) {
if (!copyOfSource.remove(o)) {
differedTasksList.add(o);
System.out.println("Task not present: " + o.toString());
return false;
} else {
matchedTasksList.add(o);
}
}
matchedTasksList.clear();
for (Task o : source) {
if (!copyOfActual.remove(o)) {
differedTasksList.add(o);
System.out.println("Task not present: " + o.toString());
return false;
} else {
matchedTasksList.add(o);
}
}
return (differedTasksList.size() == 0) ? true : false;
}
答案 0 :(得分:2)
public boolean compare(List<Task> source, List<Task> actual) {
Set<Task> intersection = new HashSet<>(source);
Set<Task> sourceDifference = new HashSet<>(source);
Set<Task> actualDifference = new HashSet<>(actual);
intersection.retainAll(actualDifference);
sourceDifference.removeAll(intersection);
for (Task t: sourceDifference) {
System.out.println(String.format("Task %s not present in actual", t));
}
actualDifference.removeAll(intersection);
for (Task t: actualDifference) {
System.out.println(String.format("Task %s not present in source", t));
}
return sourceDifference.isEmpty() && actualDifference.isEmpty();
}
答案 1 :(得分:0)
似乎该函数只打印第一个缺少的元素,但据我所知,你需要打印所有缺少的元素并返回false?如果是这样尝试:
public boolean compare(List<Task> source, List<Task> actual) {
List<Task> copyOfSource = new ArrayList<>(source);
copyOfSource.removeAll(actual);
copyOfSource.forEach(o -> System.out.println("Task not present: "+o.toString()));
return copyOfSource.isEmpty();
}