【问题标题】:Why does Arrays.asList(charArray).indexOf always return -1?为什么 Arrays.asList(charArray).indexOf 总是返回 -1?
【发布时间】:2016-02-17 05:07:26
【问题描述】:

所以我正在尝试创建一个方法,您可以将一个简单的字符串发送到该方法,然后在 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");
    }
}

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

我做错了吗?很明显,但我不明白什么/为什么它没有为任何字符获取任何索引。任何帮助将不胜感激。

输入:

"Hello"

输出: 调试

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

【问题讨论】:

  • 仔细查看Arrays.asList(alpha) 返回的内容。你可能会感到惊讶。

标签: java arrays indexof


【解决方案1】:
char[] alpha = {...};
index = Arrays.asList(alpha).indexOf(Character.toUpperCase(c));

问题很微妙。 Arrays.asList(T...) 需要 T 的数组,其中 T extends Object。如果您传递一组原语,它不会像您期望的那样工作。在这种情况下,它会认为 T = char[] 并返回一个包含单个元素 alphaList&lt;char[]&gt;

List&lt;char[]&gt; 包含字符数组,而不是字符,因此 indexOf 调用始终返回 -1

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

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

如果字符在范围内,另一种方法是做一些简单的数学运算。

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

【讨论】:

    【解决方案2】:

    这是你想要做的吗?

    您可以利用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,但不知道它更容易。
    【解决方案3】:

    indexOf() 正在对对象进行比较。 Character.toUpperCase() 返回一个字符,但是数组中的每一项都是一个字符,所以没有匹配。

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 这并不能真正回答 OP 的问题:为什么数组越界?
      • 我能问一下是什么让您将我的答案标记为否决吗?无论您的数组是否已排序,此解决方案都将起作用。
      猜你喜欢
      • 1970-01-01
      • 2012-01-25
      • 2017-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多