¿Cómo leer continuamente un archivo en Java?

Hay un archivo que contiene 5 conjuntos de 8 números. Cada conjunto son las "puntuaciones" para los concursantes (5 concursantes en total). Mi tarea es leer el archivo para obtener cada conjunto, recortar los puntajes más altos y más bajos, y luego calcular el puntaje promedio para cada concursante. La tarea también requiere que usemos un método para calcular promedios, por lo que no se me permite atascar todo mi programa en el método principal.

Aquí está el conjunto de datos para referencia:

8.4 9.1 8.5 8.4 9.1 8.7 8.8 9.1
7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0
8.0 7.9 8.0 8.0 8.0 8.0 8.0 8.1
7.0 9.1 8.5 8.4 7.0 8.7 8.8 9.1
7.0 7.9 7.0 7.8 7.0 5.0 7.0 7.5

Sin embargo, me he encontrado con un problema. Los promedios para cada concursante se calculan iguales. Esto se debe a que cada vez que llamo al método average (), crea una nueva instancia de la lectura del archivo, por lo que lee los primeros 8 dígitos cada vez.

Aquí está mi código:

//Code

import java.util.*;
import java.io.*;

public class DhruvPTheWinner{

 //Method for averaging
 public static double average()
 {
     double avg = 0.0;
     double sum = 0.0;
     double val = 0.0;
     double highest = -999.0;
     double lowest = 999.0;

     //This is how we were taught to read a file, using Try and Catch to "import" the file
     Scanner inFile = null;
     try{
            inFile = new Scanner (new File("theWinner.dat"));
        }
     catch (FileNotFoundException e){
            System.out.println("File not found");
            System.exit(0);
        }

     for(int j = 1; j <= 8; j++){
         val = inFile.nextDouble();
         //If statement to contain highest
         if(val > highest)
         {
             highest = val;
         }
         //If statement to contain lowest
         if(val < lowest)
         {
             lowest = val;
         }

         //Add the value (one of 8 #s) to the sum
         sum += val;

        }

     //Take out highest and lowest so avg only includes middle 6
     sum = (sum-highest)-lowest;
     avg = sum/6;

     return avg;
    }

 public static void main(String[] args){
        //Scores for the Contestants
        double c1Score = average();
        double c2Score = average();
        double c3Score = average();
        double c4Score = average();
        double c5Score = average();
        //Printing the scores
        System.out.printf("c1 is %.3f \nc2 is %.3f \nc3 is %.3f \nc4 is %.3f \nc5 is %.3f", c1Score, c2Score, c3Score, c4Score, c5Score);

 }
}

Cuando se ejecuta, esta es la salida:

c1 is 8.767 
c2 is 8.767 
c3 is 8.767 
c4 is 8.767 
c5 is 8.767

¿Cómo soluciono este problema y hago que la computadora continúe leyendo el archivo, en lugar de comenzar de nuevo?

Gracias por cualquier ayuda.

Respuesta 1

Alternativamente, puede declarar el Scanner inFilecomo una variable global estática e inicializarlo solo una vez main()antes de llamar a la average()función.

Esto va en el ámbito de la clase:

public class DhruvPTheWinner{
    private static Scanner inFile=null;

Pon esto en principal:

     try{
            inFile = new Scanner (new File("theWinner.dat"));
        }
     catch (FileNotFoundException e){
            System.out.println("File not found");
            System.exit(0);
        }

El resto sigue igual.

Respuesta: 2

El problema es que cada vez que llama averageestá volviendo a abrir el archivo (al principio).

Intenta dividir en dos partes

1) En mainfunción: abrir y cerrar el Scannerobjeto y leer una fila de datos en una matriz

2) Pase la matriz a average

Pseudocódigo sería

Main

for(int j = 0; j < 8; j++){
     val[j] = inFile.nextDouble();
}

average (val);

public static double average(double [] arr)

for(int j = 0; j < 8; j++){
    val = arr[j];
    .... // as before
}
Respuesta: 3

Tenemos un programa java que depende del código C ++ a través de JNI. Tenemos .so y .dll para solaris y ventanas de código C ++ ubicados en classpath del programa java. También en Windows hemos generado java.exe ...

QueryCursor funciona sin modo de transacción, incluso la transacción si declara directamente. Utilizo métodos get y put y declaro directamente la transacción. Funciona normal, es decir: Encender encender = ...; IgniteCache & ...

¿Hay alguna manera de agregar el componente ActiveMQ a través de javacode en el XML de ApplicationConfig de Spring? Mi objetivo principal es recoger el "brokerURL" de un archivo de propiedad externo. Pero el archivo de propiedad no es un ...

En un proyecto Java en el que estoy trabajando con IntelliJ, aumentamos la longitud de línea permitida en el estilo de código. IntelliJ felizmente envuelve líneas que son más largas de lo permitido por el estilo de código cuando ...