2014-10-21 2 views
2

두 개의 ArrayList 요소가 같은지 여부를 기본적으로 확인하기 위해 재귀 적 도우미 메서드를 호출하는 메서드를 작성하고 있다면 true를 반환합니다. 테스트 할 때 두 개의 동일한 길이와 첫 번째와 마지막 요소가 같지만 그 사이에 다른 요소가 있어도 메서드가 true를 반환한다는 것을 깨달았습니다. 나는 그 방법이 다르게 작동한다고 생각한다. 이 문제를 해결할 수있는 방법에 대한 제안이나 힌트가 있습니까?ArrayList와 재귀 메서드 비교

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

답변

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

, BTW 여기에 짧은 재귀 버전의 :

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