Токенайзер строк, очистить ввод? - PullRequest
0 голосов
/ 01 октября 2010

Я работаю над программой, которая записывает записи в виде

<book #>,<name>,<publisher>

например

123,Example Book,Publisher

После чего пользователь возвращается в меню, используя цифры, чтобы выбрать, какую опцию они хотели бы.

я получаю java.util.InputMismatchException в этом меню всякий раз, когда строка берется с пробелом. такой как в примере выше с «Пример книги». тогда как, если бы это был «ExampleBook», я бы не получил такой ошибки.

Есть ли другой способ получить данные? Для строки, которую я использовал keyboard.next(), которая не принимает \n, и я думаю, что это может быть проблемой.

Ответы [ 3 ]

0 голосов
/ 01 октября 2010

Пример использования класса сканера

    String s = "1,1n,1b\n2,2n,2b\n2,2n,2b\n";
    Scanner sc = new Scanner(s);
    StringBuilder sb = new StringBuilder();

    while (sc.hasNextLine()) {
        String[] sa = sc.nextLine().split(",");
        sb.append("nr:\t").append(sa[0]).append("\n");
        sb.append("\tbook name:\t").append(sa[1]).append("\n");
        sb.append("\tpublisher:\t").append(sa[2]).append("\n");
    }

    System.out.println(sb.toString());

Это распечатывает:

nr: 1
    book name:  1n
    publisher:  1b
nr: 2
    book name:  2n
    publisher:  2b
nr: 2
    book name:  2n
    publisher:  2b

Примечание. При использовании файла не забудьте закрыть его после:

Scanner sc = new Scanner(new File("input.data"));
...
sc.close();
0 голосов
/ 02 октября 2010

Как указано в javadoc , java.util.Scanner использует разделитель по умолчанию пробел .Строка 123,Example Book,Publisher будет интерпретироваться как две строки: 123,Example и Book,Publisher.Скорее всего, вы вызываете next() только один раз (что возвращает первую часть), а затем при переходе в меню вызываете другой следующий метод, возможно, nextInt(), который должен вернуть какой-то выбранный номер пункта меню.,Но вместо этого он пытается вернуть вторую часть, которую он вообще не может проанализировать / преобразовать в int, и, таким образом, выдает InputMismatchException.

. Есть несколько способов решить эту проблему.,Самым простым решением было бы позволить сканеру разделять ввод с помощью новых строк вместо пробелов (которые охватывают не только новые строки, но также пробелы и табуляции и некоторые другие специальные пробелы).

keyboard.useDelimiter("\n");

Далее, ваша проверка вводаи обработка исключений должна быть более устойчивой, чтобы избежать будущих InputMismatchException с.По возможности используйте hasNext() методы и их специфичные для типа аналоги, такие как hasNextInt().

При этом не вызывайте Scanner aStringTokenizer.Это только сбивает с толку других;)

0 голосов
/ 01 октября 2010

Из документов на StringTokenizer

StringTokenizer - это устаревший класс, который сохраняется по соображениям совместимости хотя его использование не рекомендуется в новых код. Рекомендуется, чтобы кто-нибудь ища эту функциональность использовать метод разделения строки или Вместо этого пакет java.util.regex.

что произойдет, если вы используете что-то вроде String.split () , оно должно вернуть список строк в массиве, и вы можете работать с ними? Извините, не показывая какой-либо код, трудно предложить улучшение. PS: Что за клавиатура?

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