Java 为什么Arrays.asList(charArray).indexOf总是返回-1?

Java 为什么Arrays.asList(charArray).indexOf总是返回-1?,java,arrays,indexof,Java,Arrays,Indexof,因此,我尝试创建一个方法,将一个简单字符串发送到该方法,然后在for循环中逐字符分解,将数组“alpha”中的每个字符转换为其在“beta”中的等效值,然后使用StringBuilder将它们全部连接起来,并作为“输出”发送回,如下所示: 代码: 我简化了整个类和所有变量名,以提高可读性 import java.util.Arrays; public class Test { private final char[] alpha = { 'A', 'B', 'C', 'D', 'E'

因此,我尝试创建一个方法,将一个简单字符串发送到该方法,然后在for循环中逐字符分解,将数组“alpha”中的每个字符转换为其在“beta”中的等效值,然后使用StringBuilder将它们全部连接起来,并作为“输出”发送回,如下所示:

代码: 我简化了整个类和所有变量名,以提高可读性

import java.util.Arrays;

public class Test {
    private final char[] alpha = {  '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'};

    public String getAlpha(String input) {

        StringBuilder output = new StringBuilder();

        for (int i = 0; i < input.length(); i++) {

            char c = input.charAt(i);
            int index;

            if (Character.isLetter(c)) {
                try {
                    index = Arrays.asList(alpha).indexOf(Character.toUpperCase(c));

                    System.out.println(c); //debug
                    System.out.println(index); //debug

                    //output.append(beta[index]); //gets the index and applies it to beta (unnecessary for this example)
                } catch(ArrayIndexOutOfBoundsException e) {
                    e.printStackTrace();
                }
            } else {
                output.append(c);
            }
        }

        return output.toString();
    }

    public static void main(String[] args) {
        Test test1 = new Test();

        test1.getAlpha("Hello");
    }
}
输出: 调试

问题很微妙
array.asList(T..)
需要一个
T
数组,其中
T扩展对象
。如果传递一个基元数组,它的工作方式与预期不同。在这种情况下,它考虑
T=char[]
并返回一个
列表
,其中包含单个元素
alpha

列表
包含字符数组,而不是字符,因此
indexOf
调用始终返回
-1

您可能想知道为什么没有得到编译时错误。如果在
列表
上调用
indexOf
引用,那么不应该期望传递一个
char[]
引用吗?好吧,令人惊讶的是,没有。
indexOf
的签名是
int indexOf(Object)
:它接受任何类型的对象,即使是与
T
无关的对象

你可以用。因为数组已排序,所以这将起作用。或者您可以使用
字符串
而不是
char[]
数组

另一种方法是,如果角色在范围内,则进行一些简单的数学运算

char uc = Character.toUpperCase(c);
if (uc >= 'A' && uc <= 'Z') {
    index = uc - 'A';
}
char uc=Character.toUpperCase(c);
如果(uc>='A'&&uc尝试以下方法:

index=newstring(alpha).indexOf(Character.toUpperCase(c));

这就是您想要做的吗

通过利用
char
值映射到ASCII int值这一事实,您可以完全避免边界外搜索(或线性/二进制搜索),并且您可以对它们进行简单的数学运算以获得字符位置

输出

H
8
e
5
l
12
l
12
o
15

private final String alpha=“abcdefghijklmnopqrstuvxyz”;
公共字符串getAlpha(字符串输入){
StringBuilder输出=新的StringBuilder();
对于(int i=0;i
indexOf()正在对对象进行比较。Character.toUpperCase()返回一个字符,但数组中的每个项都是char,因此没有匹配项


如果您将char[]更改为Character[],您将获得预期的行为。

仔细查看什么
Arrays.asList(alpha)
返回。您可能会感到惊讶。这并没有真正回答OP的问题:为什么数组超出边界?我可以问一下是什么让您将我的答案标记为否决票吗?无论数组是否排序,此解决方案都会起作用。这也很有趣,谢谢。我曾想过使用ascii,但不知道这很容易呃。
char[] alpha = {...};
index = Arrays.asList(alpha).indexOf(Character.toUpperCase(c));
char uc = Character.toUpperCase(c);
if (uc >= 'A' && uc <= 'Z') {
    index = uc - 'A';
}
H
8
e
5
l
12
l
12
o
15
private final String alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

public String getAlpha(String input) {

    StringBuilder output = new StringBuilder();

    for (int i = 0; i < input.length(); i++) {

        char c = input.charAt(i);

        if (Character.isLetter(c)) {
            int index = Character.toUpperCase(c) - 'A' + 1;
            System.out.println(c); //debug
            System.out.println(index); //debug

            //output.append(beta[index]); //gets the index and applies it to beta (unnecessary for this example)

        } else {
            output.append(c);
        }
    }

    return output.toString();
}