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

String.charAt()在java中返回奇怪的结果,java,arrays,java-8,char,indexof,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++

我有以下代码

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)));
 }
Arrays.asList(alphabet).indexOf(str.charAt(i))返回的结果是'a'97而不是'a' 因此它不匹配,因为返回了-1

我需要
Arrays.asList(alphabet).indexOf(str.charAt(I))
返回“a” 这就是我所想的
charAt
返回的只是“a”,而不是这个“a”97

任何替代方法?

str.charAt(i)
返回一个
char
,并且
列表包含
字符串
元素。
由于
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)
这样可以很好地编译:

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)

需要注意的是,字符和字符串在Java中不是一回事。A
char
是一种基本的数字类型,其文本用单引号表示(例如
'A'
)。字符串是逻辑上由多个字符组成的引用类型

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

String alphabet = "abcdef...";
并在查找索引时扫描该字符串:

 chars.add(alphabet.indexOf(str.charAt(i)));
请注意,现在使用的是而不是以前使用的
List
indexOf方法

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

char[] alphabet = new char[] {'a', 'b', /* ... */ };
数组。asList(字母表)
是一个
列表
。它不包含任何类型的
字符

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

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


这是因为
char!=java中的字符串

所以要解决你的问题,

Arrays.<String>asList(alphabet).indexOf(Character.toString(str.charAt(i)))
Arrays.asList(字母表).indexOf(Character.toString(str.charAt(i)))
现在您将获得预期的输出


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

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

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

    String str = "abc";

    for ( Character character : str.toCharArray() )
    {
        indices.add(Arrays.asList(alphabet).indexOf(character.toString()));
    }
List index=new ArrayList();
String str=“abc”;
for(字符:str.toCharArray())
{
add(Arrays.asList(alphabet).indexOf(character.toString());
}

可以对
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)

缺少
字符的类型
,我只是假设它是
列表

,如果它返回-1,这意味着
列表
不包含您正在搜索的内容。您正在搜索
String
列表中的
char
是否确保
Arrays.asList(alphabet).indexOf(str.charAt(i))
返回“a”?它看起来更像是
-1
ohh,而
char
是一种整数类型(某种类型),你可以用它做数学运算:
str.charAt(i)-'a'
将为
a
返回零,为
b
返回1。。。在上述代码中不需要数组/列表-或例如
'b'-'a'==1
Arrays.<String>asList(alphabet).indexOf(Character.toString(str.charAt(i)))
    List<Integer> indices = new ArrayList<>();

    String str = "abc";

    for ( Character character : str.toCharArray() )
    {
        indices.add(Arrays.asList(alphabet).indexOf(character.toString()));
    }
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)