Я не могу прочитать все цифры в .txt - PullRequest
1 голос
/ 17 октября 2019

Я пытаюсь усреднить файл, который содержит 10 миллионов чисел, в каждой строке есть одно число. я создал метод с именем getAverage (), который возвращает двойной. Это код:

public double promedioDouble() throws IOException
    {
        double adder = 0;
        int counter = 0;
        try{
                file = new FileReader(filePath);
                reader = new BufferedReader(file);
                while(reader.readLine()!=null)
                {
                    adder+=Double.parseDouble(reader.readLine());
                    counter++;
                }

            }
        catch (IOException e) 
        {
              System.out.println("cant read");
        }
        finally {
            if (file != null) file.close();
        }             
        return adder/counter;
    }

Я напечатал счетчик, и он показал мне 5.000.000, я не знаю, почему читатель не может прочитать число 10 миллионов, содержащееся в файле, и он читает только половину,Мне нужна помощь с этим.

Ответы [ 2 ]

6 голосов
/ 17 октября 2019

Вы звоните readLine дважды - и игнорируете строки, возвращаемые в условии while.

Попробуйте вместо этого:

            String line;
            while( (line = reader.readLine()) !=null)
            {
                adder+=Double.parseDouble(line);
                counter++;
            }

Вы также можете сделать это сПотоки (и попытка с ресурсами - избегая необходимости в finally):

    try (Stream<String> stream = Files.lines(Paths.get(fileName))) 
    {
        stream.forEach(s -> {adder+=Double.parseDouble(s); counter++;});

    } catch (IOException e) {
        e.printStackTrace();
    }
2 голосов
/ 17 октября 2019

Мой ответ немного далек от вашего вопроса. Если вы используете Java 8, вы можете быстро сделать это следующим образом:

try (Stream<String> stream = Files.lines(Paths.get(fileName))) {

        return stream.mapToDouble(Double::parseDouble)
                .average()
                .getAsDouble();

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