2015-10-04 3 views
-2

Изучение Java как моего первого языка, и я нашел решение проблемы в codingbat, но я не понимаю, почему мое решение не работает и вам понравится ваша помощь.Переключение последних двух символов в строку

Учитывая строку любой длины, возвращает новую строку, где последние 2 символы, если они присутствуют, поменяны местами, так что «кодирование» дает «codign».

lastTwo ("кодирование") → "codign"
lastTwo ("кошка") → "Cta"
lastTwo ("AB") → "ба"

Это мой не работает код:

public String lastTwo(String str) { 

    int strLength = str.length(); 
    String last = str.substring(strLength-1,strLength); 
    String bLast = str.substring(strLength-2,strLength-1); 

    if(strLength<2) 
    return str; 
    return str.substring(0, strLength-2)+last+bLast; 
} 

Это те ошибки, и я не могу понять, почему:

lastTwo ("а") →"Исключение: java.lang.StringIndexOutOfBoundsException: Строка индекса вне диапазона: -1 (номер строки: 5)"

lastTwo ("") →
«Исключение: java.lang.StringIndexOutOfBoundsException: Строка индекса из диапазон: -1 (номер строки: 4) «

Кажется, что проблема возникает при вводе менее 2 символов, но я не могу понять, почему. Для меня логика if выглядит нормально.

ответ

0

Вам нужно двигаться, если условие в методе, как:

public static void main(String[] args) { 
    System.out.println(lastTwo("coding")); 
    System.out.println(lastTwo("cat")); 
    System.out.println(lastTwo("ab")); 
    System.out.println(lastTwo("a")); 
} 
public static String lastTwo(String str) { 

    int strLength = str.length(); 
    if(strLength<2) 
     return str; 

    String last = str.substring(strLength-1,strLength); 
    String bLast = str.substring(strLength-2,strLength-1); 
    return str.substring(0, strLength-2)+last+bLast; 
} 

Это будет печатать:

codign
Cta
ба
a

В способе, если длина str составляет менее 2 (например, 1), в этом случае он будет возвращен, иначе он будет вычислять last и blast, а затем выполнить операцию.

0

Если входной сигнал составляет 1 символ, strLength-2 - -1. Метод substring вызывает ошибку, поскольку такой индекс не существует. (То же самое относится и к 0 полукокса и strLength-1)

0

Вы должны поставить эту проверку на верхних

if(strLength<2) 
    return str; 

Если у вас есть этот код, если строка «», он пытается получить подстроку между позициями -1,0 и -2, - 1. Вы не можете получить подстроку в позиции ниже 0.

int strLength = str.length(); 
String last = str.substring(strLength-1,strLength); 
String bLast = str.substring(strLength-2,strLength-1); 
0

Simpler решение взять строку запуска из-и

добавить последний-символ, а затем

добавьте до-последнего преобразовывались:

public static String lastTwo(String str) { 
    if (str.length()<2){ 
     return str; 
    } else{ 
     return str.substring(0, str.length() - 2) + 
       str.charAt(str.length() - 1) + 
       str.charAt(str.length() - 2); 
    } 
} 
+0

Этот код также потерпит неудачу. – Tom

+0

Привет, Том, почему?. его скомпилированы и протестированы. s = «cat» возвращает «cta», s = «кодирование» возвращает «codign». – chenchuk

+0

Вы должны проверить строку, которая уже сбой в коде OPs ... – Tom

0
public String lastTwo(String str) { 
    if(str != null) { 
     int strLength = str.length(); 
     if (strLength < 2) 
      return str; 
     String last = str.substring(strLength-1,strLength); 
     String bLast = str.substring(strLength-2,strLength-1); 
     return str.substring(0, strLength-2)+last+bLast; 
    } 
    return null; 
} 

Проблема в вашем коде String bLast = str.substring(strLength-2,strLength-1); , когда strLength = 1, и вы вычитаете на 2 и ваш inde x будет равным -1, следовательно, IndexOutOfboundException. Используйте код выше, чтобы решить вашу проблему.

+0

Является ли это просто мной, или возвращает «null», не имеет никакого смысла? – Tom

0

Одна из перегрузок для подстроки может принимать начальный индекс, он вычисляет последний индекс. Поэтому следующее должно дать вам последние два символа:

str.substring(java.lang.Math.max(0,str.length()-2)) 
Смежные вопросы