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

Dae*_*ric 4 java arrays indexof

所以我试图创建一个方法,你发送一个简单的字符串,然后在for循环中由char分解char,数组"alpha"中的每个char转换为"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");
    }
}
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是我的每个char的索引始终导致ArrayIndexOutOfBounds异常,因为indexOf无法在数组"alpha"中找到等效的字符.

难道我做错了什么?显而易见,但我无法理解为什么/为什么它没有得到任何char的任何索引.任何帮助将不胜感激.

输入:

"Hello"
Run Code Online (Sandbox Code Playgroud)

输出: debug

H
-1
e
-1
l
-1
l
-1
o
-1
Run Code Online (Sandbox Code Playgroud)

Joh*_*ica 13

char[] alpha = {...};
index = Arrays.asList(alpha).indexOf(Character.toUpperCase(c));
Run Code Online (Sandbox Code Playgroud)

问题很微妙.Arrays.asList(T...)期待一个数组在T哪里T extends Object.如果传递一组基元,它就不会像你期望的那样工作.在这种情况下,它会思考T = char[]并返回List<char[]>包含单个元素的内容alpha.

A List<char[]>包含char数组,而不是字符,因此indexOf调用始终返回-1.

您可能想知道为什么不会出现编译时错误.如果它被调用,不应该indexOf期望传递char[]参考List<char[]>?好吧,令人惊讶的是,没有.它indexOf的签名是int indexOf(Object):它接受任何类型的对象,甚至是与之无关的对象T.

你可以用Arrays.binarySearch.这可以工作,因为您的数组已排序.或者您可以使用String而不是char[]数组.

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

char uc = Character.toUpperCase(c);
if (uc >= 'A' && uc <= 'Z') {
    index = uc - 'A';
}
Run Code Online (Sandbox Code Playgroud)