0

我正在尝试使用一种方法来比较 t2o 不同的列表。基本上,我想将两个不同的列表传递给一个方法,如果一个数组列表的元素使用.contains 包含在另一个数组列表中,该方法将返回真或假。现在它只返回 true - 我不知道为什么。我希望它返回false。如果有人可以帮助我解决这个问题,那就太好了。

public class ArrayListTest {

public static void main(String[] args) {

    List<String> list1 = new ArrayList<String>();
    List<String> list2 = new ArrayList<String>();

    list1.add("cat");
    list1.add("dog");
    list1.add("zebra");
    list1.add("lion");
    list1.add("mouse");

    //Test Values
    //list2.add("cat");
    list2.add("lizard");

    boolean doesitcontain = contains(list1, list2); 
    System.out.println(doesitcontain);


}

public static boolean contains (List<String>list1, List<String>list2){

boolean yesitcontains;

for(int i = 0; i < list1.size(); i++){

    if(list2.contains(list1.get(i))){
        System.out.println("Duplicate: "+list1.get(i));
        yesitcontains = true;
        System.out.println(yesitcontains);
    }else{
        yesitcontains = false;
        System.out.println(yesitcontains);
    }
}
    if (yesitcontains = true){

        return true;

    }else 

        return false;

}

}
4

4 回答 4

6
  1. 您无意中使用了赋值运算符,而您打算使用相等运算符。在您的特定情况下,您应该重写所有这些:

    if (yesitcontains = true){
    
        return true;
    
    }else 
    
       return false;
    
    } 
    

    只是

    return yesitcontains;
    

    并避免任何混淆的机会。

  2. 此外,您的算法将不起作用,因为您应该true在看到重复项时立即返回。相反,您继续循环并“忘记”您的发现。false除非最后一个元素重合,否则您可以期望它始终返回。

  3. 在更广泛的背景下,我还应该给你以下一般性建议:

    • 避免对列表进行索引迭代。并非所有列表都是ArrayLists 并且可能显示 的 O(n) 复杂度get(i)。而是使用增强的for循环,更安全、更简洁、更明显;
    • 了解图书馆:如果您只是在确认没有重复项之后,Collections.disjoint(list1, list2)就会为您提供所需的内容;
    • 请注意算法复杂性:检查两个列表中的重复项是 O(n 2 ),但如果将其中一个变为 a HashSet,则会得到 O(n)。

考虑到上述所有内容,以下将是适当的实现:

static boolean disjoint(Collection<?> c1, Collection<?> c2) {
    for(Object o : c1) 
      if (c2.contains(o)) 
        return true;
    return false;
}

如果您查看Collections.disjoint,您会发现这个完全相同的循环,前面有一段代码,出于上述原因优化了集合的使用。

于 2013-06-20T16:06:49.723 回答
3
 if (yesitcontains = true){

应该

if (yesitcontains == true){

==用于比较,=用于赋值。

if (yesitcontains = true){

将始终评估if(true)哪个导致return true;

编辑:

(或者)

就像return yesitcontains;评论一样。

于 2013-06-20T16:05:00.093 回答
3

在我看来,您的方法应该重写为:

public static boolean contains(List<String>list1, List<String>list2) {
    return list2.containsAll(list1);
}

您当前拥有的代码实际上只检查最后一个元素list1是否也在list2.

如果您实际上是在寻找contains any,那么这个简单的解决方案就可以了:

public static boolean contains(List<String>list1, List<String>list2) {
    for (String str : list1) {
        if (list2.contains(str)) {
            return true;
        }
    }
    return false;
}
于 2013-06-20T16:09:12.063 回答
1
if (yesitcontains == true)  { } // use `==` here 

要不就

if (yesitcontains) { }

下面的代码分配trueyesitcontains,并且表达式将始终是true

if (yesitcontains = true) { }

您的代码中没有任何意义if(),您可以简单return yesitcontains;

于 2013-06-20T16:05:28.253 回答