List.Contains可疑电话

时间:2011-06-09 20:37:40

标签: java list

我试图基于char数组是否包含给定的char来运行while循环。我以为我可以通过以下方式实现这一目标:

while(Arrays.asList(letterMatrix).contains(keyword.charAt(i-1)))

其中letterMatrix是char [] [],关键字是String。

但我在NetBeans中收到以下警告:对java.util.Collection.contains的可疑调用:给定对象不能包含char实例(期望的char [])。

我是一个java新手,但我认为这意味着.contains期待一个数组,我不明白为什么会这样。

我错过了什么?

6 个答案:

答案 0 :(得分:1)

Arrays.asList(char[][])将返回List<char[]>,现在弄明白:)

答案 1 :(得分:0)

Arrays.asList(letterMatrix)将生成此对象List<Char[]>,如果您查看方法contains(),它希望您要查找的对象与列表的类型相匹配,因此您正在寻找char数组列表中的char

编辑:见评论

List<Character> checkList = new ArrayList<Character>();
for(char[] charArray : letterMatrix) {
    for(char aChar : charArray) {
        checkList.add(aChar);
    }
}
while(checkList.contains(keyword.charAt(i-1)));

答案 2 :(得分:0)

首先,您可能不希望在while循环声明中调用Arrays.asList(...);此方法在每次调用时返回一个新的ArrayList。此外,正如其他答案所示,返回的值将是List<char[]>。所以,试试:

public void testTwoDimAsList() {
    char[][] arr = new char[][]{{'a', 'b', 'c'}, {'1', '2', '3'}};
    List<char[]> asList = Arrays.asList(arr);
    // ...
}

当然,数组列表中#contains的运行时间是线性的,也可能不是最佳的。

答案 3 :(得分:0)

怎么样。 Arrays.deepToString(letterMatrix).contains("" + keyword.charAt(i-1));
对于您的情况,这是最快的方法。它将您的矩阵转换为String,然后在其中搜索您的char。

答案 4 :(得分:0)

Cosmin和Tnem已经指出为什么这个警告是合理的,因为它确实表明了一个错误。以下是修复方法:

boolean contains(char[][] matrix, char wanted) {
    for (char[] line : matrix) {
        for (char c : line) {
            if (c == wanted) {
                return true;
            }
        }
    }
}

while (contains(letterMatrix, keyword.charAt(i-1)) {
    ....
}

当然,正如两个嵌套循环提示,如果矩阵很大,这个解决方案会有点慢。可能需要支持高效查找的数据结构。

答案 5 :(得分:0)

好的,基本上您需要了解的是char[]无法与PDT char进行比较。

您必须遍历新制作的列表并在其上创建新列表。

e.g。

while(Arrays.asList(Arrays.asList(letterMatrix).get(x)).contains(keyword.charAt(i-1)))