Java 为什么Arrays.asList(charArray).indexOf总是返回-1?
因此,我尝试创建一个方法,将一个简单字符串发送到该方法,然后在for循环中逐字符分解,将数组“alpha”中的每个字符转换为其在“beta”中的等效值,然后使用StringBuilder将它们全部连接起来,并作为“输出”发送回,如下所示: 代码: 我简化了整个类和所有变量名,以提高可读性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'
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();
}