int cannot be converted to String при создании элемента массива
public class StringSplit {
public static String[] solution(String s) {
//Write your code here
if (s.length()%2==1){
s = s + '_';
}
String[] result = new String[s.length()/2];
for (int i=0; i<s.length()/2; i++){
result[i] = s.charAt(i*2) + s.charAt(i*2+1);
}
return result;
}
}
Друзья, подскажите пожалуйста, почему элементы массива не создаются, ошибка int cannot be converted to String и указатель на плюсик, хотя никаких цифр нет. Как только добавляешь "" в начало строки - пропускает (подсмотрел в решении). Вот так работает:
result[i] = "" + s.charAt(i*2) + s.charAt(i*2+1);
Ответы (3 шт):
Потому что при арифметических операциях char неявно приводится к int. И ты соответственно пытаешься записать в переменную типа Стринг значение int. Значением int арифметическая операция перестанет быть, как только ты туда передашь какое-то значение Стринг. Допустим: " ". Тогда это уже будет конкатенация строк, а не арифметическое сложение и ты получишь Стринг. Для максимальной наглядности:
System.out.println(5 + 5 + 5); // На выходе: 15
System.out.println("" + 5 + 5 + 5); // На выходе 555 "" - это пустая строка
Спасибо, а какой еще есть способ конкатенации букв? Добавлять "" выглядит как костыль и додуматься самому до этого решения нереально, а это новичковая задача (7 kata). Почему вообще язык со строгой типизацией допускает что String.charAt(N) может быть цифрой?
Преобразование типов введено в язык, чтобы использовать в одном выражении различные типы данных. И соответственно были введены правила преобразования данных, с идеей, что в выражении все данные должны быть приведены до одного типа. Согласно которым данные типа byte и char приводятся к int, для выполнения операций.
Насколько я знаю, лучший способ это использование StringBuilder для конкатенации строк. Объекты в Java бывают изменяемые и неизменяемые. Объекты типа String - неизменяемые. То есть при конкатенации строк, строка не меняется, а создается новая. То есть при множественной конкатенации создается куча объектов типа Стринг, что очень ресурсоёмко. При использовании метода append объекта Стригбилдер - новая строка не создается, а редактируется объект типа Стрингбилдер.