use*_*531 3 java arrays char indexof java-8
我有以下代码
String[] alphabet = new String[] { "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n",
"o", "p", "q","r", "s", "t", "u", "v", "w", "x", "y", "z"};
Run Code Online (Sandbox Code Playgroud)
如果我做
String str = "aa";
for(int i=0;i<str.length();i++) {
chars.add(Arrays.asList(alphabet).indexOf(str.charAt(i)));
}
Run Code Online (Sandbox Code Playgroud)
字符中的值是
0 = -1
1 = -1
Run Code Online (Sandbox Code Playgroud)
由Arrays.asList(字母)返回的结果.indexOf(str.charAt(i))是'a'97而不是"a"因此它不匹配,因为返回-1
我需要Arrays.asList(alphabet).indexOf(str.charAt(i)) 返回"a",这就是我认为的charAt回归,这只是"a"而不是'a'97
任何替代?
str.charAt(i)返回a char 和Listcontains String元素.
作为char是不是String和String.equals()而Character.equals()不是他们(间互操作"a".equals('a')和Character.valueOf('a').equals("a")回报false),stringList.indexOf(anyChar)将始终返回-1.
你可以替换:
chars.add(Arrays.asList(alphabet).indexOf(str.charAt(i)));
^----- List<String> ^----- char (that will be boxed to Character)
Run Code Online (Sandbox Code Playgroud)
通过:
chars.add(Arrays.asList(alphabet).indexOf(String.valueOf(str.charAt(i))));
^----- List<String> ^----- String
Run Code Online (Sandbox Code Playgroud)
比较String有String.
或作为替代方案比较char与char依靠char[],而不是String[]如:
char[] alphabet = new char[] { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
'o', 'p', 'q','r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'};
Run Code Online (Sandbox Code Playgroud)
通过这种方式,这将编译正常:
List<Character> charList = IntStream.range(0, alphabet.length)
.mapToObj(i -> alphabet[i])
.collect(Collectors.toList());
chars.add(charList.indexOf(str.charAt(i)));
^------- List<Character> ^------ char (that will be boxed to Character)
Run Code Online (Sandbox Code Playgroud)
不是你的直接问题,但List在每次迭代中创建相同的东西是不合逻辑的,有点浪费.
在循环之前实例化一次更有效:
List<String> alphabetList = Arrays.asList(alphabet);
String str = "aa";
for(int i=0;i<str.length();i++) {
chars.add(alphabetList.indexOf(String.valueOf(str.charAt(i))));
}
Run Code Online (Sandbox Code Playgroud)