簡體   English   中英

ArrayList比較與遞歸方法

[英]ArrayList comparison with a recursive method

我正在編寫一個方法,該方法調用遞歸幫助器方法,以基本上查看兩個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);
}

您的問題在這里:

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;

順便說一句,這是較短的遞歸版本:

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));
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM