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

时间:2018-08-29 19:06:17

标签: java arrays java-8 char indexof

我有以下代码

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"};

如果我愿意

 String str = "aa";
 for(int i=0;i<str.length();i++) {
    chars.add(Arrays.asList(alphabet).indexOf(str.charAt(i)));
 }

字符中的值是

0 = -1
1 = -1 

作为Arrays.asList(alphabet).indexOf(str.charAt(i))返回的结果是'a'97而不是“ a” 因此由于返回-1而与之不匹配

我需要Arrays.asList(alphabet).indexOf(str.charAt(i))返回“ a” 那就是我认为charAt返回的只是“ a”而不是“ a” 97

有其他选择吗?

6 个答案:

答案 0 :(得分:6)

str.charAt(i)返回一个char,而List包含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)

作者:

chars.add(Arrays.asList(alphabet).indexOf(String.valueOf(str.charAt(i))));
                ^----- List<String>             ^----- String

比较StringString

或者通过依赖char而不是charchar[]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'}; 

这样可以很好地编译:

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)

这不是您的直接问题,但是在每次迭代中创建相同的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))));
}

答案 1 :(得分:1)

请务必注意,在Java中,字符和字符串不是同一回事。 char是一种原始的数字类型,其文字使用单引号引起来(例如'a')。字符串是一种逻辑上由多个字符组成的引用类型。

最简单的解决方案是使您的字母成为单个字符串:

String alphabet = "abcdef...";

并在找到索引时扫描该字符串:

 chars.add(alphabet.indexOf(str.charAt(i)));

请注意,这现在使用的是String.indexOf,而不是您以前使用的List indexOf方法。

或者,将alphabet转换为字符数组:

char[] alphabet = new char[] {'a', 'b', /* ... */ };

答案 2 :(得分:1)

Arrays.asList(alphabet)List<String>。它不包含任何类型Character的东西。

如果要查找由该单个字符组成的字符串,请构建该单个字符的字符串:

Arrays.asList(alphabet).indexOf(Character.toString(str.charAt(i)))

Arrays.asList(alphabet).indexOf(str.substring(i, i+1))

答案 3 :(得分:0)

这是因为Java中的char != string

所以要解决您的问题,

Arrays.<String>asList(alphabet).indexOf(Character.toString(str.charAt(i)))

现在,您将获得预期的输出。

所以问题是您创建了字符串列表,并正在字符串中查找字符,因此java找不到它。因此它返回了-1

答案 4 :(得分:0)

您可以将String转换为字符数组并对其进行迭代:

    List<Integer> indices = new ArrayList<>();

    String str = "abc";

    for ( Character character : str.toCharArray() )
    {
        indices.add(Arrays.asList(alphabet).indexOf(character.toString()));
    }

答案 5 :(得分:0)

可以对char进行整数运算-它是整数类型(显示为字符)。示例:'b' - 'a' == 1'c' - 'a' == 2,依此类推。 (实际上是'a' == 97,它是Unicode值)。

对于给定的代码,不需要数组或列表,可以将其写为

for (int i=0; i<str.length(); i++) {
    chars.add(str.charAt(i) - 'a');
}

确保循环可以写为

for (char ch : str.toCharArray()) {
    chars.add(ch - 'a');
}

甚至使用流:

str.chars().map(ch -> ch - 'a').forEach(chars::add)

缺少chars类型,我只是假设它是List<Integer>