我有以下代码
String[] alphabet = new String[] { "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"};
如果我这样做
String str = "aa";
for(int i=0;i<str.length();i++) {
chars.add(Arrays.asList(alphabet).indexOf(str.charAt(i)));
}
字符中的值为
0 = -1
1 = -1
因为 Arrays.asList(alphabet(.indexOf(str.charAt(i(( 返回的结果是 'a'97 而不是 'a' 因此它不匹配,因此返回 -1
我需要Arrays.asList(alphabet).indexOf(str.charAt(i))
返回"a" 这就是我认为charAt
返回的只是"A"而不是这个"A"97
还有其他选择吗?
str.charAt(i)
返回一个char
,List
包含String
元素。
由于char
不是String
,String.equals()
和Character.equals()
它们之间不可互操作("a".equals('a')
和Character.valueOf('a').equals("a")
返回false
(,stringList.indexOf(anyChar)
将始终返回-1
。
您可以替换 :
chars.add(Arrays.asList(alphabet).indexOf(str.charAt(i)));
^----- List<String> ^----- char (that will be boxed to Character)
由:
chars.add(Arrays.asList(alphabet).indexOf(String.valueOf(str.charAt(i))));
^----- List<String> ^----- String
将String
与String
进行比较.
或者作为替代方案,通过依赖char[]
而不是String[]
来将char
与char
进行比较,例如:
char[] alphabet = new char[] { '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'};
这样,这将编译得很好:
List<Character> charList = IntStream.range(0, alphabet.length)
.mapToObj(i -> alphabet[i])
.collect(Collectors.toList());
chars.add(charList.indexOf(str.charAt(i)));
^------- List<Character> ^------ char (that will be boxed to Character)
不是您的直接问题,但是在每次迭代中创建相同的List
是不合逻辑的,并且有点浪费。
在循环之前实例化一次更有效:
List<String> alphabetList = Arrays.asList(alphabet);
String str = "aa";
for(int i=0;i<str.length();i++) {
chars.add(alphabetList.indexOf(String.valueOf(str.charAt(i))));
}
重要的是要注意,字符和字符串在Java中不是一回事。char
是原始的数字类型,其文字使用单引号给出(例如'a'
(。字符串是逻辑上由多个字符组成的引用类型。
最简单的解决方案是将字母表变成一个字符串:
String alphabet = "abcdef...";
并在查找索引时扫描该字符串:
chars.add(alphabet.indexOf(str.charAt(i)));
请注意,它现在使用String.indexOf
而不是您之前使用的List
indexOf 方法。
或者,将alphabet
转换为字符数组:
char[] alphabet = new char[] {'a', 'b', /* ... */ };
Arrays.asList(alphabet)
是一个List<String>
。它不包含任何类型Character
.
如果要查找由该单个字符组成的字符串,请构建该单个字符的字符串:
Arrays.asList(alphabet).indexOf(Character.toString(str.charAt(i)))
或
Arrays.asList(alphabet).indexOf(str.substring(i, i+1))
这是因为在java中char != string
,
因此,为了解决您的问题,
Arrays.<String>asList(alphabet).indexOf(Character.toString(str.charAt(i)))
现在,您将按预期获得输出。
所以问题是你创建了字符串列表,并在字符串中寻找一个字符,所以java找不到它。所以它返回-1
.
您可以将字符串转换为字符数组并循环访问它:
List<Integer> indices = new ArrayList<>();
String str = "abc";
for ( Character character : str.toCharArray() )
{
indices.add(Arrays.asList(alphabet).indexOf(character.toString()));
}
可以对char
进行整数运算 - 它是一个整数类型(显示为字符(。示例:'b' - 'a' == 1
、'c' - 'a' == 2
等。(实际上'a' == 97
,它的Unicode值(。
对于给定的代码,不需要数组或列表,它可以写成
for (int i=0; i<str.length(); i++) {
chars.add(str.charAt(i) - 'a');
}
确保循环可以写成
for (char ch : str.toCharArray()) {
chars.add(ch - 'a');
}
甚至使用流:
str.chars().map(ch -> ch - 'a').forEach(chars::add)
缺少chars
的类型,我只是假设它是List<Integer>