Почему этот код для определения того, какое слово появляется первым или вторым, тоже работает с помощью пользовательского ввода? - PullRequest
0 голосов
/ 07 мая 2018

Nevermind - не хотел удалять вопрос, поэтому я обновляюсь. Я не заметил, что использовал next () вместо nextLine ().

Кредит: поиск, какая подстрока стоит первой, какая идет второй, а какая третья

Вот где я увидел код. Я нашел то, что искал, но когда я попробовал код с помощью сканера, он не показал бы мне все слова, которые были первыми, какие вторые и какие третьи. Это только показало мне, что было первым. Когда я написал те же слова, используя строку, он дал мне ответы, но когда я использовал сканер, он показал бы только первое слово.

Вот код:

String testString = s.next();
String[] frags = testString.split("( )"); //Inside the brackets were letters, but I replaced them with a space.
if(frags.length >= 1) {  //Also could someone explain to me why should the length be greater(or equal) to 1, 2, and 3?
    System.out.println("first=" + frags[0]);
    if(frags.length >= 2) {
        System.out.println("second=" + frags[1]);
        if(frags.length >= 3) {
            System.out.println("third=" + frags[2]);
        }
    }
} else {
    System.out.println("nothing found");
}

1 Ответ

0 голосов
/ 07 мая 2018

Заголовок: Почему этот код не решает, какое слово появляется первым или вторым? по вводу пользователя тоже?

Ожидаете ли вы, что ваши пользователи будут вводить строки, содержащие открывающие и закрывающие скобки с пробелом в середине? Например:

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 массива.

enter image description here

Первое условие 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]);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...