Неправильные числа или ошибки при чтении строк чисел из файла данных

#java #file #project

#java #файл #проект

Вопрос:

Я пытаюсь прочитать файл данных и взять 3 строки чисел и сохранить их в массив. Я так запутался в том, как мне следует подойти к этому. Я даже не уверен, что мой while цикл даже правильный. Формат файла сбивает меня с толку. Я создаю переменные для хранения имени, школы, результатов и сложности для дайвера, но когда я помещаю это в свой diveScore метод, цифры неверны, или возникает ошибка при чтении файла, когда я не использую Double.parseDouble() способ. Параметрами метода являются номер погружения (от 1 до 3), массив из 7 баллов и сложность погружения (от 1 до 4). Должен ли я также вызывать метод diveScore 3 раза для каждого погружения? У каждого дайвера есть 3 погружения, поэтому есть 3 строки чисел.

Класс Diver:

     public class Diver {
    
    private String name;
    private String school;
    private double [] scoreArray = new double[3];
    private double totalScore;

    Diver() {
        
    }
    Diver(String name, String school) {
        this.name = name;
        this.school = school;
    }
    //loop through score array and calculate the total score for each dive attempt
    public double [] diveScore(int diveNum, double [] scores, double difficulty) {
        double min = min(scores);
        double max = max(scores);
        
        for (int i = 0; i < scores.length; i  ) {
            totalScore  = scores[i];
        }
        totalScore -= max;
        totalScore -= min;
        totalScore *= difficulty;
        
        for (int i = 0; i < scoreArray.length; i  ) {
            scoreArray[i] = totalScore;
        }
        return scoreArray;
    }
    //finds smallest score in array of scores
    private double min(double [] scores) {
        java.util.Arrays.parallelSort(scores);
        
        double min = scores[0];
        return min;
    }
    //finds largest score in array of scores
    private double max(double [] scores) {
        java.util.Arrays.parallelSort(scores);
        
        double max = scores[scores.length - 1];
        return max;
    }
    //calculates total of the 3 dives
    public double totalScore() {
        for (int i = 0; i < scoreArray.length; i  ) {
                totalScore  = scoreArray[i];
        }
        return totalScore;
    }
    public String toString() {
        String str = name   ", "   school   ": "   totalScore   "n"   "Dive 1: "   scoreArray[0]   "n"   "Dive 2: "   scoreArray[1]   "n"   "Dive 3: "   scoreArray[2]   "n";
        return str;
    }
}
  

Основной файл:

 import java.io.File;
import java.io.FileNotFoundException;
import java.util.InputMismatchException;
import java.util.Scanner;

public class Main {

public static void main(String[] args) throws FileNotFoundException {
    Diver [] divers = new Diver[25];
    int numDivers = readFile(divers);
    System.out.println(numDivers);
    
}
public static int readFile(Diver [] divers) throws FileNotFoundException {
    File f = new File("divers.dat");
    Scanner kb = new Scanner(f);
    Diver d;
    
    int count = 1;
    int diveNum = 1;
    while (kb.hasNextLine()) {
        String name = kb.nextLine();
        String school = kb.nextLine();
        String s1 = kb.next();
        String s2 = kb.next();
        String s3 = kb.next();
        String s4 = kb.next();
        String s5 = kb.next();
        String s6 = kb.next();
        String s7 = kb.next();
        String diff = kb.next();
        
        
        double score1 = Double.parseDouble(s1);
        double score2 = Double.parseDouble(s2);
        double score3 = Double.parseDouble(s3);
        double score4 = Double.parseDouble(s4);
        double score5 = Double.parseDouble(s5);
        double score6 = Double.parseDouble(s6);
        double score7 = Double.parseDouble(s7);
        double difficulty = Double.parseDouble(diff);
        
        double [] scores = new double [7];
        scores[0] = score1;
        scores[1] = score2;
        scores[2] = score3;
        scores[3] = score4;
        scores[4] = score5;
        scores[5] = score6;
        scores[6] = score7;
            
        count  ;
        diveNum  ;
    }
    kb.close();
    return count;
}
public static void printDivers(Diver [] divers, int numDivers) {
    System.out.println("All Diversn");
    for (int i = 0; i < divers.length; i  ) {
        if (divers[i] != null) {
            System.out.println(divers[i]);
        }
    }
}
  

}

Файл данных:

 Lucieta Spinelli
Bryn Mawr College
8 9 8 7 8 8 8 2.5
7 8 7 6 7 7 6 3.7
8 7 6 7 7 6 8 3.2
LiPing Sun
Rutgers University
6.5 5 9.5 7.5 8 8.5 7 2.3
7 9 7.5 9 8.5 6.5 8 2.6
6 4 5 9 7 8 6 3.0
Greg McEntire
University of Southern California
9 8 8.5 9.5 9 9.5 7 2.3
9 7 8 8 7.5 8.5 7.5 2.6
8 8 8 8 8 8 8 3.4
Shiva Vadaparthy
Northwestern University
9 8 9.5 9.5 7.5 8 8.5 3.0
8 9 8.5 7.5 9 8.5 8 3.6
7.5 9 8 7 8.5 8 7 4.1
Elizabeth Bennet
Oxford University
7 8 9 8 7 7 8 2.4
8 8 6 7 9 7 8 2.7
8 7 8 6 9 8 9 3.0
Sofia Berrios
Universidad Simon Bolivar
8.5 7.5 9.5 9 7 8.5 8 2.4
8 7 8 9 8 6 7 3.0
7 5.5 6.5 7 5 6.5 7 3.6
Amir Majid
Reed College
4 5 6 5 3 5 7 2.8
7 6 7 8 7 9 8 2.9
8 9 7 9 8.5 8 9 3.4
James Pajuio
University of Pennsylvania
8 7 8 9 8 6 7 2.8
7.5 9 8 7 8.5 8 7 3.0
7.5 9 8 7 8.5 8 7 4.3
Sharon Lewis
Howard University
8 9 9.5 9 8.5 8 9 2.7
4 5 5.5 7 6.5 4.5 5 3.2
8 7 8 9 8 8 7 4.0
Divya Patel
Temple University
7 9 7.5 9 8.5 6.5 8 2.1
8 7 8 6 9 8 9 2.3
3.5 5.5 4 5 3 4 4.5 4.3
Guo Zhang
Portland State University
5 6 5.5 7 6.5 7 5.5 6 3.0
8 7 8.5 9 7.5 8.5 8 3.2
9 8 9.5 8.5 9 8.5 9.5 4.1
Tomasz Wojaczyk
Tufts University
8 8 7 8 7 8 7 2.6
5 4 5 6 7 5 5 2.9
8 6 6 7 8 7 6 3.6
  

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

1. Если вам нужен вопрос actually project, чтобы прояснить весь мой абзац, тогда я тоже сделаю комментарий к этому. Я знаю, что то, что я сказал, сбивает с толку. Извините.

2. Кроме того, вывод этого текущего кода является исключением в потоке «main» java.lang.NumberFormatException: Для входной строки: «Rutgers» в java.base/jdk.internal.math. FloatingDecimal.readJavaFormatString(FloatingDecimal.java:2054) в java.base/jdk.internal.math. FloatingDecimal.parseDouble(FloatingDecimal.java:110) в java.base/java.lang. Double.parseDouble(Double.java:549) в Main.ReadFile(Main.java:34) в Main.main(Main.java:10)

3. 1) Напишите модульные тесты для каждого метода, чтобы убедиться, что ваш код выполняет то, что, по вашему мнению, он должен делать. Это фантастическая привычка, и она может приносить удовольствие. 2) Запустите свой код построчно в режиме отладки, чтобы вы могли наблюдать за изменением переменных и понимать, что происходит. 3) Ваш массив double[], набранный в методе ReadFile(), создается внутри метода и не возвращается из метода. Что касается остальной части вашей программы, этот массив может также не существовать! 4) Не стесняйтесь обращаться за более конкретной помощью по любому из этих пунктов 🙂

4. Информация об этом исключении должна содержаться в вашем вопросе. Вы можете отредактировать свой вопрос, чтобы добавить его вместо того, чтобы просто оставлять его в комментарии, где его можно легко пропустить. (Кроме того, комментарии к SO не так постоянны, как вопросы и ответы; они могут быть удалены модераторами по разным причинам.)

5. Вы могли бы использовать отладчик. Или вы могли бы поместить много операторов печати. Я бы посоветовал вам распечатать все элементы, которые вы только что прочитали, прежде чем анализировать любой из них. Это будет поучительно.

Ответ №1:

Здесь есть несколько проблем. Причиной вашего исключения являются:

Вы считываете число с next() помощью метода of Scanner , который оставляет символ конца строки в конце строки, а затем пытаетесь прочитать следующее имя с nextLine() помощью метода, который вернет пустую строку для имени, поскольку сканер просматривает конец строки.

Это усугубляется тем фактом, что за строками для имени и школы следуют три строки по восемь чисел в каждой, или всего двадцать четыре числа, но вы пытаетесь прочитать только восемь чисел.

В результате вы получаете «Lucieta Spinelli» и «Bryn Mawr College», а затем цифры 8, 9, 8, 7, 8, 8, 8, 2.5 для первой записи, а затем название «» и школа «7 8 7 6 7 7 6 3.7» изатем числа 8, 7, 6, 7, 7, 6, 8, 3.2 для второй записи, и, наконец, вы получаете название «» и школу «LiPing Sun», а затем цифры «Rutgers» и «University» и…

Ну, это все, что вы получаете, поскольку «Rutgers» — это не число, и когда вы пытаетесь преобразовать его в единицу с parseDouble помощью вашей программы, происходит сбой.

Вы также вообще не используете Diver класс; вы никогда не создаете Diver . Также нет смысла считывать числа в s1 и так Далее только для того, чтобы разобрать их и поместить в массив; вы могли бы также просто разобрать их непосредственно в массив и оставить s1 вне его, но это незначительно.

Вызов kb.close() должен находиться внутри finally блока, иначе вам следует использовать блок try-with-resources, чтобы убедиться, что файл закрыт.

Я бы настоятельно рекомендовал прочитать отличную статью Эрика Липперта «Как отлаживать небольшие программы«; с навыками, которые она вам предоставит, вам, вероятно, вообще не нужно было бы задавать этот вопрос.