【问题标题】:ArrayList comparison with a recursive methodArrayList 与递归方法的比较
【发布时间】:2014-12-17 00:29:59
【问题描述】:

我正在编写一个调用递归辅助方法的方法,以查看两个ArrayLists 的元素是否相等,如果相等则返回true。我意识到,在测试时,即使两个 ArrayLists 具有相同的长度和相同的第一个和最后一个元素但其间的元素不同,该方法也会返回 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);
}

【问题讨论】:

    标签: java list recursion arraylist


    【解决方案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;
    

    【讨论】:

      【解决方案2】:

      顺便说一句,这是更短的递归版本:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-08-22
        • 1970-01-01
        • 2014-12-07
        • 2012-02-25
        • 1970-01-01
        • 1970-01-01
        • 2017-08-07
        相关资源
        最近更新 更多