Как определить перевод строки между двумя строками или int с помощью сканера?

#java #java.util.scanner

#java #java.util.scanner

Вопрос:

Вопрос:

У меня есть этот набор чисел в документе .txt, который я хочу использовать java.util.Scanner для определения перевода строки между 123 , 456 , и 789 , распечатать числа между переводами строк, есть ли какой-нибудь способ сделать это?

 1 2 3
// n here
4 5 6
// n here
7 8 9
 

Вывод:
456

===========================================================================

Решения, которые я пробовал:

(1) Я попытался использовать метод hasNextLine(), однако, похоже, что hasNextLine() сообщит мне, есть ли токены в следующей строке, и вернет логическое значение вместо того, чтобы сообщить мне, есть ли n . if (scan.hasNextLine()) { \ do something }

(2) Я также пытался использовать: (Однако при использовании такого условия будет указано «Синтаксическая ошибка в токене «Недопустимый символ»»)

 Scanner scan = new Scanner(new File("test.txt"));

// create int[] nums

while (scan.hasNext()) {
    String temp = scan.next();
    if (temp == n) {
        // nums.add(); something like this
    }
}

System.out.print(nums); // something like this
 

Я думаю использовать n в качестве разделителей

ps. Я сделал Google, и большинство результатов подсказывают мне использовать .hasNextLine() , но я хочу, чтобы он идентифицировал перевод строки ( n)

Комментарии:

1. Возможно, сканер автоматически использует пробелы.

2. Просто читать строку за раз с помощью nextLine?

3. Вы говорите, что хотите определить перевод строки . Вместо этого думайте об этом как о пустой строке или строке нулевой длины . Продолжайте и попробуйте nextLine() . Или замените и используйте вместо. Scanner BufferedReader

4. @KevinAnderson Мой учитель не хочет использовать java.io.BufferedReader , потому что он только учил java.util.Scanner

5. @EvanKnowles Сканер фактически пропустит n и вместо этого напечатает строку с токенами.

Ответ №1:

Scanner сканирует следующий элемент, используя new-line или whitespace в качестве разделителя по умолчанию. Чтобы позволить ему читать весь контент, используйте scan.useDelimiter("\Z") .

 Scanner scan = new Scanner(new File("test.txt"));
scan.useDelimiter("\Z");
final String content = scan.next();   // content: "1 2 3rnrn4 5 6"
int index = 0;
System.out.println("Index of \n");
while (index != -1) {
     index = content.indexOf("n", index);
     if (index != -1) {
          System.out.println(index);
          // Or do whatever you wish
          index  ;
     }
}
 

Вывод:

 Index of n
5
7
 

Комментарии:

1. indexOf() возвращает -1 , когда не может найти "n" . 0 указывает начальный индекс совпадения.

2. Понятно, интересно, почему результат имеет 7, а 6 — наибольшее число в содержимом?

3. @FlashSonic526, в его примере 2 n : "1 2 3rnrn4 5 6" — 5 и 7 представляют индекс n в этой строке.

4. Интересно, вы создали n строку? Разве индекс не отсчитывается от 0?

Ответ №2:

Я не уверен, что на 100% понимаю ваш вопрос. Поэтому я предполагаю, что в вашем файле всегда будет 2 строки, разделенные ТОЛЬКО ОДНОЙ новой строкой ( n ) . Если я ошибаюсь, пожалуйста, сообщите об этом.

 String charsAfterNewLine = null;

//try-catch block with resources
//Scanner need to be closed (scan.close()) after finish with it
//this kind of block will do `scan.close()` automatically
try(Scanner scan = new Scanner(new File("test.txt"))){

    //consume(skip) first line
    if(scan.hasNextLine()){
        scan.nextLine();
    }else{
        throw new Exception("File is empty");
    }

    //get second line
    if(scan.hasNextLine()){
        charsAfterNewLine = scan.nextLine();
    }else{
        throw new Exception("Missing second line");
    }

}catch(Exception e){
    e.printStackTrace();
}

System.out.println("charsAfterNewLine: "   charsAfterNewLine);
 

Если вы хотите простой способ, без try-catch:

 String charsAfterNewLine = null;

//throws FileNotFoundException
Scanner scan = new Scanner(new File("test.txt"));

if(scan.hasNextLine()){

    //consume(skip) first line
    scan.nextLine();

    if(scan.hasNextLine()){

        //get second line
        charsAfterNewLine = scan.nextLine();

    }else{
        System.out.println("Missing second line");
    }

}else{
    System.out.println("File is empty");
}

scan.close();

System.out.println("charsAfterNewLine: "   charsAfterNewLine);
 

Результаты (для обоих):

 Input: 
    (empty file)
Output: 
    File is empty
    charsAfterNewLine: null

-----

Input:
    1 2 3 4 5 6
Output:
    Missing second line
    charsAfterNewLine: null

-----

Input:
    1 2 3n4 5 6
Output:
    charsAfterNewLine: 4 5 6
 

Комментарии:

1. Спасибо за ваш ответ, ваша рекомендация сработала в моем первоначальном вопросе. Однако, по мере продвижения вперед, я должен немного пересмотреть свой вопрос. Пожалуйста, любезно сообщите дальше с благодарностью.

2. @FlashSonic526, можешь ли ты также показать вывод для этого ввода? Будет проще понять ваш вопрос.

3. Я только что обновил вопрос для ясности, посмотрите, помогает ли это? Спасибо!

4. @FlashSonic526, код должен работать. Даже 1 2 3n4 5 6n7 8 9 если он все еще печатает 4 5 6 . Для кода требуется минимум 2 строки. Если у него более 2 строк, это не имеет значения. Он читает только первые 2 строки, а остальные игнорируются.

Ответ №3:

 while (scanner.hasNext()) {
    String data = scanner.nextLine();
    System.out.println("Data: "   data);

    if (data.isEmpty()) {
        System.out.println("Found it");
        break;
    }
}
 

Комментарии:

1. Строковые данные будут считывать каждую строку одну за другой и сохранять всю строку в строке, а затем проверять, является ли эта строка emty.

2. это сработало, но разве scanner n по умолчанию не будет пропущено?

3. Привет и добро пожаловать в StackOverflow. Пожалуйста, при ответе на вопрос не публикуйте только код. Добавьте также объяснение того, что делает ваш код, и почему вы считаете, что ваш ответ подходит для вопроса.

4. @MarioCodes Этот фрагмент кода просто прочитает каждую строку в файле и сохранит эту строку в виде строки, а затем проверит, пуста ли эта строка, используя .isEmpty() .

5. Не просто отвечайте мне в качестве комментария, добавьте его в свой ответ для завершения