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

4

我正在尝试创建一个方法,你可以向该方法发送一个简单的字符串,然后使用for循环逐个字符地将其拆分,将数组“alpha”中的每个字符转换为其在“beta”中等价的值,然后使用StringBuilder将它们全部串联起来并作为“output”返回,如下所示:

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

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

我遇到的问题是,每个字符的索引都会引起ArrayIndexOutOfBounds异常,这是因为indexOf无法在数组"alpha"中找到相应的字符等价物。
我做错了什么吗?显然是错的,但我无法理解为什么没有获取任何字符的索引。感谢任何帮助。 输入:
"Hello"

输出:调试

H
-1
e
-1
l
-1
l
-1
o
-1

1
仔细看看Arrays.asList(alpha)返回的内容,你可能会感到惊讶。 - njzk2
4个回答

12
char[] alpha = {...};
index = Arrays.asList(alpha).indexOf(Character.toUpperCase(c));

问题很微妙。 Arrays.asList(T...) 期望的是一个 T 类型的数组,其中 T extends Object。如果传递一个基本类型的数组,它不会像你期望的那样工作。在这种情况下,它会认为 T = char[] 并返回一个包含单个元素 alphaList<char[]>List<char[]> 包含 char 数组而不是字符,因此 indexOf 调用总是返回 -1
你可能会想知道为什么没有得到编译时错误。如果在 List<char[]> 上调用 indexOf,难道不应该期望传递一个 char[] 引用吗?令人惊讶的是,不需要。 indexOf 的签名是 int indexOf(Object):它接受任何类型的对象,即使与 T 无关。
你可以使用 Arrays.binarySearch。由于数组已排序,所以这将起作用。或者你可以使用 String 而不是 char[] 数组。
另一种方法是进行一些简单的数学计算,如果字符在范围内。
char uc = Character.toUpperCase(c);
if (uc >= 'A' && uc <= 'Z') {
    index = uc - 'A';
}

1

您是想做这个吗?

您可以通过利用 char 值映射到 ASCII int 值的事实,并对它们进行简单的数学运算来获取字符位置,从而完全避免 OutOfBounds(或线性/二分搜索)。

输出

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

这也非常有趣,谢谢。我考虑过使用ASCII,但不知道它甚至更容易。 - Daedric

0

indexOf() 方法是对对象进行比较。Character.toUpperCase() 方法返回一个 Character,但数组中的每个项都是 char 类型,因此没有匹配项。

如果将 char[] 更改为 Character[],则会得到您期望的行为。


-1
试试这个: index = new String(alpha).indexOf(Character.toUpperCase(c));

这并没有真正回答OP的问题:为什么数组越界了? - jmcg
我可以问一下是什么原因让您将我的答案投票否决了吗?这个解决方案将会在数组是否排序的情况下都能够工作。 - edge

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接