【问题标题】:String.charAt() returning weird result in javaString.charAt() 在 java 中返回奇怪的结果
【发布时间】:2019-02-04 15:48:47
【问题描述】:

我有以下代码

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

还有其他选择吗?

【问题讨论】:

  • 如果它返回 -1,这意味着 List 不包含您要搜索的内容。您正在 String 列表中搜索 char
  • 确定Arrays.asList(alphabet).indexOf(str.charAt(i)) 正在返回“a”?它看起来更像-1
  • 哦,char 是一个整数类型(有点),你可以用它做数学运算:str.charAt(i) - 'a' 将为 a 返回零,为 b 返回 1,...在上面的代码中不需要数组/列表 - 或者例如'b' - 'a' == 1

标签: java arrays java-8 char indexof


【解决方案1】:

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

作者:

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

比较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'}; 

这样编译就可以了:

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

【讨论】:

    【解决方案2】:

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

    最简单的解决方案是让你的字母表变成一个字符串:

    String alphabet = "abcdef...";
    

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

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

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

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

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

    【讨论】:

      【解决方案3】:

      Arrays.asList(alphabet)List&lt;String&gt;。它不包含Character 类型的任何内容。

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

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

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

      【讨论】:

        【解决方案4】:

        这是因为char != string在java中,

        所以为了解决你的问题,

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

        现在您将按预期获得输出。

        所以问题是您创建了字符串列表并在字符串中寻找一个字符,所以 java 无法找到它。所以它返回了-1

        【讨论】:

          【解决方案5】:

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

              List<Integer> indices = new ArrayList<>();
          
              String str = "abc";
          
              for ( Character character : str.toCharArray() )
              {
                  indices.add(Arrays.asList(alphabet).indexOf(character.toString()));
              }
          

          【讨论】:

            【解决方案6】:

            可以对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&lt;Integer&gt;

            【讨论】:

              猜你喜欢
              • 2012-08-08
              • 2012-12-09
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多