Создание цикла, который возвращает символы до попадания символа двоеточия - PullRequest
0 голосов
/ 06 сентября 2018

Каждый раз, когда я запускаю свой код, он возвращает это сообщение об ошибке:

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 5
    at java.lang.String.charAt(Unknown Source)
    at codes.Main.main(Main.java:10)

Вот мой код:

    package codes;

public class Main {
    public static void main(String[] args) {
        String cord1 = "Name: x=23 y=60 z= 600";
        String cord2 = "Name: x=200 y=20 z= 300";
        int c1 = cord1.length();
        String mychar = String.valueOf("cord1".charAt(0));
        for (int a = 0; a < c1; a++){
            mychar = String.valueOf("cord1".charAt(a));
            if (mychar == ":"){
                break;
            }else{
                cord1.substring(a);
            }
        }
    }
}

Ответы [ 3 ]

0 голосов
/ 06 сентября 2018

Используйте равно вместо "==" Как это

 if (mychar.equals(":")){
            break;

Вам нужно использовать метод equals, потому что вы работаете со строкой. Когда бы вы ни работали со строкой, вы должны сравнивать их с методом equals Если вы использовали

char myChar = .....

Ваш код будет работать. Вы можете сравнить символы с "=="

0 голосов
/ 06 сентября 2018

String.valueOf("cord1".charAt(0)) означает, что вы смотрите на 0-й символ строки «cord1», который имеет наивысший индекс 4, поэтому он выдает исключение из границ при значении 5.

Что вам нужно сделать, это String.valueof(cord1.charAt(0)). Это будет считать строку в переменной cord1.

0 голосов
/ 06 сентября 2018

В вашем коде несколько ошибок ..

  1. mychar == ":" должно быть mychar.equals(":") вместо. Поскольку строки неизменяемы, нам нужно использовать .equals для их сравнения вместо == (<- проверяет, равны ли ссылки вместо строковых значений). </li>
  2. "cord1".charAt должна быть вашей переменной cord1.charAt .. Используя "cord1", вы в основном создаете новую строку со значением cord1.
  3. cord1.substring(a); не изменяет значение cord1, но возвращает новую строку. Поэтому вам придется сохранить этот результат String или распечатать его, а затем остановить цикл с помощью break.
  4. Использование cord1 = cord1.substring(a) приведет к сокращению самой строки. Поскольку вы продолжаете цикл в диапазоне [0, c1), где c1 была исходной строкой, мы все равно получили бы исключение StringIndexOutOfBoundsException. Вместо этого вам не нужен else-case, и вам нужны оба параметра cord1 = cord1.substring(a) и break внутри if-case. (Также я предполагаю, что вы хотите удалить и сам :, поэтому вам придется использовать .substring(a+1).)
  5. Кроме того, зачем использовать String.valueOf( char ) вместо того, чтобы просто использовать char? На самом деле это не является обязательным требованием, но String.valueOf в некотором роде избыточен и делает код менее читабельным.

Собираем все вместе:

public class Main {
    public static void main(String[] args) {
        String cord1 = "Name: x=23 y=60 z= 600";
        System.out.println("cord1 before:\t" + cord1);
        int c1 = cord1.length();
        char mychar = cord1.charAt(0);
        for (int a = 0; a < c1; a++){
            mychar = cord1.charAt(a);
            if (mychar == ':'){
                cord1 = cord1.substring(a+1);
                break;
            }
        }
        System.out.println("cord1 after:\t" + cord1);
    }
}

В результате cord1 будет иметь значение " x=23 y=60 z= 600" (обратите внимание на начальный пробел) в конце.

Попробуйте онлайн.


Вот гораздо более простая альтернатива с тем же результатом:

String cord1 = "Name: x=23 y=60 z= 600";
String cord1ExcludingName = cord1.replaceFirst("^.*:","");

Попробуйте онлайн.

^       : Only look at the start of the String for:
 .*     : Zero or more of any character,
   :    : followed by a `:`

Что будет заменено на "" (пустая строка), поэтому они в основном удалены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...