Java中“包含”函数的行为

时间:2012-01-03 09:37:39

标签: java contains

我正在调试我的代码,看起来内置函数contains在我的情况下无法正常工作。看:

List<Integer[]> allVariables = new ArrayList<Integer[]>();
Integer[] cols = {1};

列表包含值:

[0] = Integer[1] => {1}
[1] = Integer[4] => {1,2,3,4}

因此,以下IF表达式必须为TRUE,但它为false:

if (allVariables.contains(cols[0])) {
    //...
}

有什么问题?

8 个答案:

答案 0 :(得分:2)

该列表包含Integer[]个对象,因此如果您询问它是否包含cols,它将返回true。但是,它不包含每个单独的数组元素。

如果要对这些数组的每个元素使用contains,则应该将数组的每个元素添加到列表而不是数组本身(例如,使用Collections#addAll

答案 1 :(得分:2)

您有一个Integer[]而非List<Integer>的列表。这就是问题所在。在进行比较时,您会询问Integer x = 1是否等于Integer[] y = {1};

答案 2 :(得分:2)

数组是可变的,因此只有它们是相同的数组才相等。 (不基于其内容)如果您想比较使用List<Integer>

所需的内容

此外,您无法将元素与数组进行比较,它们永远不会相等。

尝试以下

public static void main(String... args) {
    List<List<Integer>> allVariables = new ArrayList<List<Integer>>();
    allVariables.add(Arrays.asList(1));
    allVariables.add(Arrays.asList(1,2,3,4));

    testContains(allVariables, 1);
    testContains(allVariables, 1, 2);
    testContains(allVariables, 1, 2, 3);
    testContains(allVariables, 1, 2, 3, 4);
}

private static void testContains(List<List<Integer>> allVariables, Integer... ints) {
    List<Integer> intList = Arrays.asList(ints);
    System.out.println("allVariables contains " + intList +
                       " is " + allVariables.contains(intList));
}

打印

allVariables contains [1] is true
allVariables contains [1, 2] is false
allVariables contains [1, 2, 3] is false
allVariables contains [1, 2, 3, 4] is true

答案 3 :(得分:1)

包含通过引用搜索对象 - 而不是值。您有两个具有相同值的不同数组 - {1}

答案 4 :(得分:1)

包含只会查找列表实际表示的类型。

因此,如果您有Integer[]的列表,则无法传递int并获得true结果(因为int不能是null)。

要做到这一点,你必须自己进行深度搜索:

for(Integer[] arr : allVariables) {
    for(Integer i : arr) {
        if(i != null && i.equals(searchValue)) return true;
    }
}
return false;

答案 5 :(得分:1)

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Collection.html#contains%28java.lang.Object%29

您的集合包含数组,而不是整数。因此包含对数组的方法检查。您的检查应该是if(allVariables.contains(cols)),或者,如果要检查整数值,则需要遍历列表中的所有数组并按顺序检入它们。

答案 6 :(得分:1)

cols[0]Integer,而不是Integer[],这是您列表的元素类型。因此,只有contains才能找到匹配项。单元素数组不等于它的单个元素 - 它们是不同类型的不同对象。

答案 7 :(得分:0)

在java中,cols [0]与cols非常不同。在C / C ++中它们是相同的。 通过cols [0],您将引用Integer []中的第一个元素。尝试打印cols [0]和cols的值,你可以找到差异。

java api显示的行为在您的情况下是完整的。因为cols [0]将始终返回1,这就是你在Integer []中所拥有的。但是arraylist中没有1作为整数。所以,它总是假的。