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

时间:2016-02-17 05:07:26

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

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

我做错了吗?显而易见,但我无法理解为什么/为什么它没有为任何char获取任何索引。任何帮助将不胜感激。

输入:

"Hello"

输出: 调试

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

4 个答案:

答案 0 :(得分:13)

tableList = [[UITableView alloc] initWithFrame:self.bounds style:UITableViewStylePlain];

问题很微妙。 char[] alpha = {...}; index = Arrays.asList(alpha).indexOf(Character.toUpperCase(c)); 需要一个Arrays.asList(T...)数组T。如果你传递一组基元,它就不会像你一样工作。在这种情况下,它会认为T extends Object并返回包含单个元素T = char[]的{​​{1}}。

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

你可能想知道为什么你没有得到编译时错误。如果在indexOf上调用-1,那么indexOf期待char[]引用是否应该被传递?好吧,令人惊讶的是,没有。 List<char[]>的签名是indexOf:它接受任何类型的对象,甚至是与int indexOf(Object)无关的对象。

您可以使用Arrays.binarySearch。这可以工作,因为您的数组已排序。或者您可以使用T代替String数组。

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

char[]

答案 1 :(得分: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();
}

答案 2 :(得分:0)

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

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

答案 3 :(得分:-1)

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