Заголовок: Почему этот код не решает, какое слово появляется первым или вторым?
по вводу пользователя тоже?
Ожидаете ли вы, что ваши пользователи будут вводить строки, содержащие открывающие и закрывающие скобки с пробелом в середине? Например:
Hi( )my( )name( )is( )Jane.
Может быть, но почему-то я в этом сомневаюсь. Когда люди вводят строку текста, они обычно используют пробел для разделения слов. Имея это в виду, ваш метод String.split () должен учитывать это. Скорее всего, вы захотите использовать split Текст, предоставленный пользователем, - это небольшое Регулярное выражение :
"\\s+"
То, что делает это выражение при применении к методу String.split () , заключается в том, что оно будет разбивать строку на основе одного или более пробелов , Ваша строка кода должна выглядеть так:
String[] frags = testString.split("\\s+");
Использование буквального пробела с разбиением также будет работать:
String[] frags = testString.split(" ");
, но использование вышеприведенного регулярного выражения позаботится о любом сценарии пробелов.
Если случайно вы ожидаете, что пользователь предоставит текст с заключенным в скобки содержимым для разделения слов (или, возможно, вы получаете строки из файла), то вы можете использовать это небольшое регулярное выражение с String.split ( ) метод:
"\\((.*?)\\)"
Это позволит методу split разбить предоставленную пользователем строку по скобкам Open и Close независимо от того, что содержится в этих скобках:
String[] frags = testString.split("\\((.*?)\\)");
Комментарий к коду: Также кто-то может объяснить мне, почему длина должна быть больше (или
равно) 1, 2 и 3
frags - массив, индексирование которого основано на 0 (первый элемент массива имеет индекс 0 ... не 1). Атрибут Array.length всегда возвращает буквальную длину массива, тогда как первый элемент массива фактически считается в позиции 1 массива.
Первое условие if просто гарантирует, что действительно существует элемент массива с индексом 0 и что массив имеет длину не менее 1 элемента (было указано как минимум одно слово). Так как условие для этого оператора if было успешным (условие было истинным), почему бы не посмотреть, сможем ли мы быть успешными со вторым оператором if , чтобы увидеть, было ли введено второе слово (по крайней мере, два слова были предоставлены). И что, черт возьми, если второе условие if было сочтено истинным, тогда давайте перейдем к третьему утверждению if , чтобы увидеть, были ли хотя бы три или более слова введены. Вы здесь только три слова.
Длина массива в основном говорит вам, сколько слов было предоставлено:
System.out.println("Words supplied by User is: " + frags.length);
, но это верно только в том случае, если метод String.split () был успешным.
Что нужно учитывать:
Что если пользователь ничего не предоставил (просто нажмите Enter)? Да, это тоже будет разделено, но массив будет иметь длину 1 (1 элемент с индексом 0), а элемент будет иметь пустую строку ( "" ). Вам нужно будет справиться с этой ситуацией, если она возникнет случайно . Таким образом, мягко говоря, независимо от того, что предоставляет Пользователь (кроме выхода), всегда найдется что-то найденное, оператор else никогда не попадет в цель. Скорее всего, было бы лучше использовать "ничего не найдено" для проверки, была ли предоставлена правильная строка:
if (testString == null || testString.equals("")) {
System.out.println("Nothing Supplied!");
return;
}
и это должно быть сделано еще до того, как вы проведете разделение. Зачем обрабатывать пустую строку?
Scanner scan = new Scanner(System.in);
System.out.println("Enter a string: ");
String testString = scan.nextLine();
if (testString.equals("")) {
System.out.println("Nothing Supplied! Quitting!");
System.exit(0);
}
String[] frags = testString.split("\\s+");
if (frags.length >= 1) {
System.out.println("First word is:\t" + frags[0]);
if (frags.length >= 2) {
System.out.println("Second word is:\t=" + frags[1]);
if (frags.length >= 3) {
System.out.println("Third word is:\t" + frags[2]);
}
}
}