String.charAt()在java中返回奇怪的结果

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

任何替代?

dav*_*xxx 6

str.charAt(i)返回a charListcontains String元素.
作为char是不是StringString.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)

比较StringString.

或作为替代方案比较charchar依靠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)