str.charAt(i)
возвращает char
, а List
содержит String
элементов.
Поскольку char
не является String
, а String.equals()
и Character.equals()
не могут взаимодействовать между ними ("a".equals('a')
и Character.valueOf('a').equals("a")
return 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
с char
, полагаясь на char[]
вместо String[]
, например:
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))));
}