我试图基于char数组是否包含给定的char来运行while循环。我以为我可以通过以下方式实现这一目标:
while(Arrays.asList(letterMatrix).contains(keyword.charAt(i-1)))
其中letterMatrix是char [] [],关键字是String。
但我在NetBeans中收到以下警告:对java.util.Collection.contains的可疑调用:给定对象不能包含char实例(期望的char [])。
我是一个java新手,但我认为这意味着.contains期待一个数组,我不明白为什么会这样。
我错过了什么?
答案 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)))