#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, чтобы убедиться, что файл закрыт.
Я бы настоятельно рекомендовал прочитать отличную статью Эрика Липперта «Как отлаживать небольшие программы«; с навыками, которые она вам предоставит, вам, вероятно, вообще не нужно было бы задавать этот вопрос.