我正在编写一个调用递归辅助方法的方法,基本上看看两个ArrayList
的元素是否相等,如果是,则返回true。我意识到,在测试时,即使两个ArrayList
具有相同的长度和相同的第一个和最后一个元素但中间不同的元素,该方法返回true,这是我不想要的。我认为这种方法不然。关于如何解决这个问题的任何建议或提示?
public static boolean isEqual(ArrayList<T> list1,
ArrayList<T> list2) {
return isEqual(list1,list2,0);
}
private static boolean isEqual(ArrayList<T> list1,
ArrayList<T> list2, int n) {
if (n==0 && list1.size()==0 && list1.size() == list2.size())
return true;
else if (n>=list1.size() || n>=list2.size())
return false;
if (n<list1.size() && list1.size() == list2.size()) {
if (list1.get(n).equals((list2.get(n))))
return true;
else
return false;
}
return isEqual(list1, list2, n + 1);
}
答案 0 :(得分:3)
你的问题在这里:
if (n<list1.size() && list1.size() == list2.size()) {
if (list1.get(n).equals((list2.get(n))))
return true; // don't return true here, since you just tested one element
else
return false;
}
return isEqual(list1, list2, n + 1);
将其更改为:
if (n<list1.size() && list1.size() == list2.size()) {
if (!list1.get(n).equals((list2.get(n))))
return false;
}
return isEqual(list1, list2, n + 1);
但是你必须添加另一个你返回true的停止条件。
if (n == list1.size() && list1.size() == list2.size())
return true;
这意味着列表具有相同的长度,并且您已经成功比较了所有元素。
如果列表大小不同,您应该对列表大小进行检查并立即返回false。在这种情况下进行任何递归调用都没有意义。
if (n==0 && list1.size() != list2.size())
return false;
答案 1 :(得分:1)
顺便说一句,这是更短的递归版本:
public static <T> boolean listsEqual(List<T> l1, List<T> l2) {
return l1.size() == l2.size() && (l1.isEmpty() || listsEqual(l1, l2, l1.size()));
}
private static <T> boolean listsEqual(List<T> l1, List<T> l2, int size) {
// l1.size() == l2.size() == size here
return size == 0 || (l1.get(size - 1).equals(l2.get(size - 1)) && listsEqual(l1, l2, size - 1));
}