Метод startsWith в java. Почему не читает стринг?

388
10 февраля 2017, 03:23

Имеем два массива

String[] roles = {"Городничий", "Аммос Федорович"} String[] textLines = {"Городничий: Я пригласил вас, господа, с тем, чтобы сообщить вам пренеприятное известие: к нам едет ревизор", "Аммос Федорович: Как ревизор?",

Если я хочу проверить начинается ли в массиве String[] textLines какая то строка со слова "Городничий", то могу применить метод

for (int i = 0; i < textLines.length - 1; i++) {
        if (textLines[i].startsWith("Городничий")) {
            System.out.println("yes");
        }
    }

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

String sRoles = roles [0];
System.out.println("sRoles = "+sRoles);//выводит sRoles = Городничий

Указываем sRoles в качестве аргумента:

for (int i = 0; i < textLines.length - 1; i++) {
        if (textLines[i].startsWith(sRoles)) {
            System.out.println("yes");
        }
    }

Компилятор не ругается, но код уже не работает.Ведь в обоих случаях стринговое значение передается. Где мое непонимание этой ситуации, подскажите плиз.

Полный код

public class RolesTest {
public static void main(String[] args) {
    String[] roles = {"Городничий\n", "Аммос Федорович\n"};
    String[] textLines = {"Городничий: Я пригласил вас, господа, с тем, чтобы сообщить вам пренеприятное известие: к нам едет ревизор.\n",
            "Аммос Федорович: Как ревизор?\n"};
    String sRoles = roles [0];
    System.out.println("sRoles = "+sRoles);
    for (int i = 0; i < textLines.length; i++) {
        if (textLines[i].startsWith(sRoles)) {
            System.out.println("yes");
        }
    }
}
} 
Answer 1
String[] roles = {"Городничий\n", "Аммос Федорович\n"};

Строка "Городничий\n" не эквивалентна строке "Городничий" соответственно два приведенных примера не совпадают.

if (textLines[0].startsWith("Городничий")) {
    //сюда попадаем
}
if (textLines[0].startsWith("Городничий\n")) {
    //а сюда уже нет
}
if (textLines[0].startsWith(roles[0])) {
    //и сюда тоже нет.
}

В тексте подстрока «Городничий» есть, а подстроки «Городничий[перенос строки]» нет

Что делать с переносами строки зависит от ситуации. Можно их убрать вообще из строк поиска. Можно отфильтровывать перед поиском.

Answer 2

У вас неверное условие в цикле:

for (int i = 0; i < textLines.length - 1; i++) {

в данном случае длина 1, 1-1=0 и 0 < 0 будет false. Другими словами в тело цикла мы не попадаем ни разу. В приведённом выше рабочем кусочке кода просто длина больше, видимо это и ввело вас в заблуждение.

Достаточно будет исправить на это:

for (int i = 0; i < textLines.length; i++) {
    if (textLines[i].startsWith(sRoles)) {
        System.out.println("yes");
    }
}

Чтобы убедиться в правильности работы startsWith можете использовать этот пример:

for(String textLine: textLines){
    if (textLine.startsWith(sRoles)) {
        System.out.println("yes");
    }
}
READ ALSO
изменение стиля TableView javafx

изменение стиля TableView javafx

есть таблица с пятью столбцами

508
изменения в таблице MySQL

изменения в таблице MySQL

Есть таблица типа

398
Cannot resolve method setSupportActionbar()

Cannot resolve method setSupportActionbar()

В коде появляются 2 ошибки:

865
Размер типа boolean

Размер типа boolean

Для всех примитивных типов данных, кроме типа boolean, в Java однозначно определен размер

357