#java #string
#java #строка
Вопрос:
Я работал над этим несколько раз, но я не могу понять, как код решения CodingBat правильно возвращает строку из двух символов.
Это их решение:
public String frontBack(String str) {
if (str.length() <= 1) return str;
String mid = str.substring(1, str.length()-1);
// last mid first
return str.charAt(str.length()-1) mid str.charAt(0);
}
Но почему это работает для двух символьных строк? Если str = «AB», не должен ли код возвращать «B» (первую часть возврата) «B» (в данном случае не было бы mid =»B») и «A» … итак, «BBA»? Я думаю, что мне не хватает некоторой логики в том, как создается String mid с помощью 2-символьной строки. Спасибо!
Комментарии:
1. Чего вы ожидаете и что получается?
2. Я предлагаю добавить
System.out.println()
инструкции, чтобы посмотреть, что здесь происходит. Это поможет присвоить части инструкции return отдельным переменным, чтобы вы могли видеть, что представляет собой каждая часть.3. mid = подстрока(1,1) => подстрока(1,0). Поскольку 0 меньше 1, это ничего не возвращает
Ответ №1:
Я рекомендую установить Eclipse или другую IDE и запустить пример в режиме отладки. Это один из лучших способов изучения JAVA. Из вашего примера я могу сказать вам следующее: Mid будет равен нулю, потому что создает подстроку из позиции 1 в 1 => длина = 0
Для str = «AB» Отладочный захват:
Если бы подстрока была от 1 до 2, то в ней была бы указана буква B:
Таким образом, вы увидите в результате только str.charAt (str.length() -1) str.charAt (0), которые равны B и A.
Ответ №2:
С substring
методом легче работать, если вы считаете, что буквы находятся между индексами, как показано ниже для «AB»
A B
^ ^ ^
0 1 2
и substring(a,b)
вернуло бы символы, помещенные между индексом a
и b
.
Итак, когда мы выполняем код, подобный:
"AB".substring(0,2)
мы получаем полный"AB"
,"AB".substring(0,1)
мы получаем"A"
Что, кажется, вас смущает, так это часть, когда мы выполняем код типа: "AB".substring(1,1)
OR (0,0)
ИЛИ (2,2)
.
Когда мы используем одно и то же значение для начального и конечного индексов, результатом подстроки будет пустая строка ""
, потому что между этими индексами нет символов.
Давайте вернемся к вашему примеру.
Когда str = "AB"
и мы выполняем
String mid = str.substring(1, str.length()-1);
тогда это то же самое, что выполнить substring(1, 2-1)
=> substring(1,1)
, что означает, что mid
будет содержать пустую строку ""
.
Теперь, когда мы вызываем
return str.charAt(str.length()-1) mid str.charAt(0);
это будет оцениваться как
return 'B' "" 'A';
что означает, что в итоге мы получим
return "BA";
Ответ №3:
Параметры для substring()
являются включающими / исключающими, поэтому, когда индексы совпадают, substring()
вернет пустую строку. При строке длиной 2 это означает, что среднее значение пустое.
Вот пошаговое руководство по кодированию с «AB» в качестве входных данных
public String frontBack(String str) { // str = "AB"
// str.length() = 2, so continue
if (str.length() <= 1) return str;
// str.length()-1 = 1, so str.substring(1,1) which is empty string.
// mid = "";
String mid = str.substring(1, str.length()-1);
// last mid first
// str.charAt(str.length()-1) = "B"
// str.charAt(0) = "A"
// "B" "" "A" = "BA"
return str.charAt(str.length()-1) mid str.charAt(0);
// returns "BA"
}
Ответ №4:
Код меняет местами первый и последний символы строки. Для строки длиной 2 в середине ничего не сохраняется, потому что str.substring(1,1) возвращает пустую строку. Затем он возвращает конкатенацию последнего символа, пустой строки, сохраненной в середине, и первого символа.
public class MyClass {
public static void main(String args[]) {
String str = "AB";
if (str.length() <= 1) System.out.println(str);
String mid = str.substring(1, str.length()-1);
System.out.println("mid: " mid);
System.out.println("last: " str.charAt(str.length()-1));
// last mid first
System.out.println(str.charAt(str.length()-1) mid str.charAt(0));
}
}
При этом выводится пустая строка, затем B, затем BA.
Ответ №5:
public static String frontBack(String str) {
if (str.length() < 2)
return str;
char first = str.charAt(0);
char last = str.charAt(str.length() - 1);
if (str.length() == 2)
return Character.toString(last) first;
return last str.substring(1, str.length() - 1) first;
}