Проблемы с логикой substring () для 2-символьной строки в CodingBat

#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;
}