Имеем два массива
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");
}
}
}
}
String[] roles = {"Городничий\n", "Аммос Федорович\n"};
Строка "Городничий\n"
не эквивалентна строке "Городничий"
соответственно два приведенных примера не совпадают.
if (textLines[0].startsWith("Городничий")) {
//сюда попадаем
}
if (textLines[0].startsWith("Городничий\n")) {
//а сюда уже нет
}
if (textLines[0].startsWith(roles[0])) {
//и сюда тоже нет.
}
В тексте подстрока «Городничий» есть, а подстроки «Городничий[перенос строки]» нет
Что делать с переносами строки зависит от ситуации. Можно их убрать вообще из строк поиска. Можно отфильтровывать перед поиском.
У вас неверное условие в цикле:
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");
}
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Для всех примитивных типов данных, кроме типа boolean, в Java однозначно определен размер