Найдите MIN / MAX / SUM из текстового файла - PullRequest
0 голосов
/ 04 мая 2020

Входной текстовый файл:

Мин .: 1,2,3,5,6

Макс .: 1,2,3,5,6

Avg: 1,2,3,5,6

Получите значения MIN / MAX и SUM из списка чисел в текстовом файле.

package net.codejava;

import java.io.FileReader;
import java.util.Scanner;
import java.io.FileNotFoundException;
import java.util.Arrays;
import java.util.Formatter;

public class MyFile {
       public static int[] toIntArray(String input, String delimiter) {

            return  Arrays.stream(input.split(delimiter)).mapToInt(Integer::parseInt).toArray();
    }
    public static void main(String[] args) throws FileNotFoundException {
        //Declare Variables
        int min = Integer.MAX_VALUE;
        int max = Integer.MIN_VALUE;
        double avg = 0.0;
        int sum = 0;
        int count = 0;
        String[] numArray = new String[30];
        int[] maxArray;
        int[] minArray;
        int[] sumArray;

        try {
            //Read the text file ('input.txt')
            String myFile = "input.txt";
            Scanner input = new Scanner(new FileReader(myFile));    
            while(input.hasNext()) {
                input.next();
                numArray[count] = input.next();
                count++;
                }
        } catch(FileNotFoundException e) {
            System.out.println("File not found!");  
        }

        minArray = toIntArray(numArray[0],",");
        maxArray = toIntArray(numArray[1],",");
        sumArray = toIntArray(numArray[2],",");

        System.out.println(" Min Value " + Arrays.stream(minArray).min().getAsInt());
        System.out.println(" Max Value " + Arrays.stream(maxArray).max().getAsInt());
        System.out.println(" Sum Value " + Arrays.stream(sumArray).sum());
    }
}

Желаемый результат:

Минус [1, 2, 3, 5, 6] равен 1

Минус [1, 2, 3, 5, 6] равен 6

Среднее значение [1, 2, 3, 5, 6] составляет 3,4

Токовый выход:

Exception in thread "main" java.util.NoSuchElementException

    at java.base/java.util.Scanner.throwFor(Scanner.java:937)

    at java.base/java.util.Scanner.next(Scanner.java:1478)

    at net.codejava.MyFile.main(MyFile.java:32)

Ответы [ 3 ]

1 голос
/ 04 мая 2020

Возможно, один из самых простых способов решения этой проблемы с использованием метода Arrays.stream приведен ниже,

Формат файла:

Min:1,2,3,5,6
Max:1,2,7,5,6
Avg:1,2,3,5,6

Java код:

package org.personal.TestProject;


import java.io.FileNotFoundException;
import java.util.Arrays;
import java.util.Scanner;
import java.io.FileReader;


public final class MinMaxAvg {


    public static int[] toIntArray(String input, String delimiter) {

        return  Arrays.stream(input.split(delimiter))
                .mapToInt(Integer::parseInt)
                .toArray();
    }

    public static void main(String[] args) throws FileNotFoundException {
//Declare Variables
        int min ;
        int max ;
        double avg ;
        int sum;
        int count = 0;
        String[] numArray = new String[3];
        int[] maxArray;
        int[] minArray;
        int[] sumArray;

//Read the text file ('input.txt')

            String fileName = "input.txt";
            Scanner input = new Scanner(new FileReader(fileName));

//Read the numbers. Get count.
        while (input.hasNext()) {
            numArray[count] = input.next();
            count++;
        }

// Convert the comma seperated string to Int array after removing Min:, Max: and Avg: pattern from the string

        minArray = toIntArray(numArray[0].replaceAll("Min:",""),",");
        maxArray = toIntArray(numArray[1].replaceAll("Max:",""),",");
        sumArray = toIntArray(numArray[2].replaceAll("Avg:",""),",");

// Use arrays.stream to find min,max,sum and average. Sum and average is generated for last line

        min = Arrays.stream(minArray).min().getAsInt();
        max = Arrays.stream(maxArray).max().getAsInt();
        sum = Arrays.stream(sumArray).sum();
        avg = Arrays.stream(sumArray).average().getAsDouble();

        System.out.println(" Min Value     " + min);
        System.out.println(" Max Value     " + max);
        System.out.println(" Sum Value     " + sum);
        System.out.println(" Average Value " + avg);


    }
}

Выход ниже,

 Min Value     1
 Max Value     7
 Sum Value     17
 Average Value 3.4
0 голосов
/ 04 мая 2020

Вы можете заменить условие в то время как l oop на: while (input.hasNext ()) {и проверить после, является ли входное значение int

0 голосов
/ 04 мая 2020

При чтении и записи также и из файлов обязательно всегда закрывайте ресурс после завершения обработки. Вы можете найти несколько способов сделать это. См. https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html для получения информации об обработке ресурсов.

    File fileName = new File("input.txt");

    try(FileReader fileReader = new FileReader(fileName);
        BufferedReader bufferedReader = new BufferedReader(fileReader);){

        String input = bufferedReader.readLine();

        while(input != null) {
            //Do something... text file will be of type String.
            input = bufferedReader.readLine();
        }

    } catch (FileNotFoundException e){
        System.out.println("File not found " + fileName.getName());
    } catch (IOException e) {
        System.out.println("Error processing file  " + fileName.getName());
    }
...