Как разделить строку на подстроки из двух символов

java string

164 просмотра

6 ответа

879 Репутация автора

Я пытаюсь разбить строки в подстроки двух символов, например, для ввода: "ABCDE" я хочу получить подстроки "AB" "BC" "CD" "DE".

Я пытался с этим:

String route = "ABCDE";
int i = 0;

 while(i < route.length()) {
            String sub = route.substring(i,i+2);
            System.out.println(sub);
            i++;
        }

но индекс (i) выходит за пределы диапазона на последней итерации и вызывает ошибку. Есть ли способ сделать это без выхода индекса (I) за пределы диапазона?

Автор: rainman Источник Размещён: 18.07.2016 01:48

Ответы (6)


4 плюса

1124 Репутация автора

Вам нужно изменить условие цикла.

while(i < route.length()-1) 

В вашем коде i идет до (length-1), а затем в функции подстроки (i, i + 2) вы даете конечный индекс i + 2. Это выше, чем самый большой индекс строки.

Кроме того, насколько я знаю, вызов библиотечной функции в условии цикла не считается хорошей практикой.

  • В каждой итерации вы вызываете эту функцию, которая занимает много времени.
  • управление переходит к этой подпрограмме в каждой итерации.

Хорошей альтернативой этому было бы сохранить длину в переменной и использовать ее в условии.

int temp = route.length()-1;
while(i<temp){
Автор: Denis Размещён: 18.07.2016 01:53

0 плюса

18537 Репутация автора

Добавьте проверку размера строки, чтобы перехватить ошибку:

String route = "ABCDE";
int i = 0;

while(i < route.length()) {
  if(i < route.length() - 1) {
  String sub = route.substring(i,i+2);
  System.out.println(sub);
  } else {
    String sub = route.substring(i,i+1);
    System.out.println(sub);
  i++;
}

Таким образом, всякий раз, когда значение счетчика i приближается к размеру строки, получается последний символ.

Автор: ישו אוהב אותך Размещён: 18.07.2016 01:55

-1 плюса

1 Репутация автора

Вы не можете использовать i < route.length(), потому что , когда i = 5, , это из индекса , поэтому используйте вместоString sub = route.substring(i,i+2);i+2=7i<route.length

Автор: Maxwell Размещён: 18.07.2016 01:55

0 плюса

315 Репутация автора

Как уже отмечал Денис, ошибка в коде находится в состоянии цикла.

Должно быть: while(i < route.length() - 1) . Однако как насчет упрощения этой логики для использования forцикла.

String route = "ABCDE";
for (int i=0; i+2<=route.length(); i++)
  System.out.println(route.substring(i,i+2));
Автор: Mursaleen Ahmad Размещён: 18.07.2016 01:56

0 плюса

851 Репутация автора

Вы получаете, StringIndexOutOfBoundsExceptionпотому что вы пытаетесь получить доступ к индексу String, который не существует.

Чтобы это исправить, измените условие цикла с

while(i < route.length())

в

while(i < route.length() - 1)

Без включения -1последняя итерация whileцикла i + 2равна 71, что выходит за Stringграницы.

Другим (более чистым) решением этой проблемы является forцикл:

for(int i = 0; i < route.length() - 1; i++) {
    System.out.println(route.substring(j, j + 2));
}

forЦикл в этой ситуации просто короче , как декларации, условное, и приращения заявления все в одной строке.

1: Это 7сводится к тому, 6что endIndexиз substringявляется эксклюзивным.

Автор: MasterBlaster Размещён: 18.07.2016 02:10

2 плюса

879 Репутация автора

Решение

Это должно работать нормально

String route = "ABCDE";
if( route.length() > 2){
    int i = 0;
    do {
        String res = route.substring(i,i+2);
        System.out.println(res);
        i++;
    } while (i + 1 < route.length());
}
else{
    System.out.println(route);
}

Изменить : добавлен граничный регистр для строки имеет длину менее 2

Автор: Shettyh Размещён: 18.07.2016 06:11
Вопросы из категории :
32x32