我正在调试我的代码,看起来内置函数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])) {
//...
}
有什么问题?
答案 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)
您的集合包含数组,而不是整数。因此包含对数组的方法检查。您的检查应该是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作为整数。所以,它总是假的。