Как использовать сканер для чтения только одной строки за раз с целыми числами? - PullRequest
2 голосов
/ 20 марта 2019

Если у меня есть файл .txt со списком номеров.Он должен возвращать сумму для всех чисел в каждой строке, а также сумму каждого числа в файле.Затем распечатайте все это в консоли.Допустим, TXT-файл:

50  3   21  10  9   9   54  47  24  74
22  63  63  28  36  47  60  3   45  83
20  37  11  41  47  89  9   98  40  94
48  77  93  68  8   19  81  67  80  64
41  73  24  29  99  6   41  23  23  44
43  41  29  11  43  94  62  27  81  71
83  14  97  67  21  68  77  25  21  24
31  8   54  14  49  96  33  18  14  80
54  55  53  38  62  53  62  10  42  29
17  89  92  87  15  42  50  85  68  43

Это мой код:

import java.io.File;
import java.io.IOException;
import java.util.Scanner;
public class Summer {
    public static void main(String args[]) throws IOException {

        File text = new File("src/nums.txt");

        if (!text.exists()) {
          text.createNewFile();
        }

        int sum = 0;
        Scanner input = new Scanner(text);
        while (input.hasNextInt()) {
            sum = sum + input.nextInt();

        }

        System.out.printf("Sum of all numbers: %d", sum);


        int lineSum = 0;
        int lineNum = 1;

        while (input.hasNext()) {
            if (input.hasNextInt()) {
                lineSum = lineSum + input.nextInt();
            } else {
                input.next();
                lineNum++;
            }
        }

        System.out.printf("%nSum of line %d: %d", lineNum, lineSum);
    }
}

Какой вывод:

Sum of all numbers: 4687
Sum of line 1: 0

Ответы [ 2 ]

2 голосов
/ 20 марта 2019

Ваш второй цикл никогда не будет работать, так как после первого вы находитесь в EOF (End-Of-File), и объект сканера не запустится с самого начала.

Лучше всего здесь использовать 2 объекта Scanner, один для чтения строки из файла и один для чтения значений из этой строки. С помощью этого решения вы можете рассчитывать итоговое значение для каждой строки и общее количество файлов одновременно.

int total = 0;
Scanner input = new Scanner(text);
while (input.hasNextLine()) {
    Scanner lineScanner = new Scanner(input.nextLine());
    int lineSum = 0;
    while (lineScanner.hasNextInt()) {
        lineSum += lineScanner.nextInt();
    }
    System.out.println(Sum of line is: " + lineSum);
    total += lineSum;
}
System.out.println("File sum is: " + total);

Моя печать немного отличается от вашей, но это легко исправить.

1 голос
/ 20 марта 2019

Проблема:

Ваша проблема здесь в том, что вы используете один и тот же экземпляр Scanner для двойного чтения файла, что вызывает проблему, поскольку он уже достигает конца файла при первом вызове while, поэтому, когда вы вспоминаете input.hasNext() это будет false, поэтому вы не введете второй while.

Решение:

Вам необходимо повторно инициализировать сканер input непосредственно перед вторым вызовом while:

int lineSum = 0;
int lineNum = 1;

//Re initialize the scanner instance here
input = new Scanner(text);
while (input.hasNext()) {
    //Do the calculations
}

Примечание:

Вам также необходимо обратить внимание на вызовы input.nextInt() и input.next() в своих вычислениях, чтобы получить желаемое поведение.

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