#java #arrays
#java #массивы
Вопрос:
У меня есть класс программы, которая считывает входной файл и отображает его. Но я пытаюсь поместить содержащиеся в нем удвоения в два массива, а затем пытаюсь найти максимальное и минимальное значение этих массивов.
Но проблема, с которой я сталкиваюсь, заключается в том, что он просто сохраняет последний двойной файл, содержащийся в файле, а другие элементы массива равны 0.0. (чего не должно быть).
Итак, вот мой код;
import java.util.Arrays;
import java.util.Scanner;
import java.util.StringTokenizer;
public class DataRow2 {
static double[] fatContentA;
static double[] protienContentA;
public static void starter() {
Scanner in=new Scanner(System.in);
int numOfClusters=in.nextInt();
int numOfElementsOfDataSet=in.nextInt();
int numOfVariables=in.nextInt();
System.out.printf("%dt %dt %dt",numOfClusters,numOfElementsOfDataSet,numOfVariables);
String line=in.nextLine();
String ignore=in.nextLine();
StringTokenizer ignoreLine = new StringTokenizer(ignore);
while (ignoreLine.hasMoreTokens()) {
System.out.println(ignoreLine.nextToken());
}
System.out.println(ignoreLine);
int counter=1;
while(in.hasNext()){
String readLine=in.nextLine();
Scanner parseInformation=new Scanner(readLine);
String nameOfMammal=in.next();
double fatContent=in.nextDouble();
double protienContent=in.nextDouble();
fatContentA=new double[numOfElementsOfDataSet];
protienContentA=new double[numOfElementsOfDataSet];
fatContentA[counter]=fatContent;
protienContentA[counter]=protienContent;
System.out.printf("%st%ft%ftn",nameOfMammal,fatContent,protienContent);
counter =1;
}
Arrays.sort(fatContentA);
int length=fatContentA.length;
//System.out.println(fatContentA[length/2]);
double max_fat = fatContentA[length-1];
double min_fat = fatContentA[0];
Arrays.sort(protienContentA);
double max_Protien = protienContentA[protienContentA.length - 1];
double min_Protien = protienContentA[0];
System.out.println("The maximum fat in this file was" max_fat);
System.out.println("The minimum fat in this file was" min_fat);
System.out.println("The maximum Protien in this file was" max_Protien);
System.out.println("The maximum Protien in this file was" min_Protien);
}
}
и это файл, который я пытаюсь прочитать;
7
25
2
Mammal fat_content(%) protein_content(%)
Bison 7.9 5.9
Guinea_pig 3.9 8.1
Dolphin 14.0 10.4
Donkey 1.4 1.7
Goat 4.1 3.4
Deer 19.7 9.2
Dog 8.3 9.5
Yak 6.7 5.3
Camel 3.4 3.5
Cat 10.9 11.1
Rabbit 13.1 7.1
Llama 3.2 3.9
Human 43.9 7.4
Mule 1.8 2.0
Elephant 5.0 4.0
Horse 1.3 2.1
Rat 12.6 12.3
Reindeer 20.3 10.4
Sheep 6.4 5.6
Pig 5.1 6.6
Fox 5.9 7.4
Whale 42.3 10.9
Polar_bear 31.0 10.2
Zebra 4.8 3.0
Seal 53.2 11.2
Результат, который я получаю, — это все данные файла, которые он считывал, и:
The maximum fat in this file was53.2
The minimum fat in this file was0.0
The maximum Protien in this file was11.2
The maximum Protien in this file was0.0
что неверно, потому что я не печатаю последние два двойника файла.
Массивы хранят только последние два дубля в последнем месте массива.
Я не понимаю, где я ошибаюсь.
Я не знаю, что еще я должен сделать, чтобы сохранить удвоения в массиве и найти max и min… Заранее спасибо за помощь, и это будет высоко оценено.
Ответ №1:
Переместите эти строки:
fatContentA=new double[numOfElementsOfDataSet];
protienContentA=new double[numOfElementsOfDataSet];
перед циклом while:
fatContentA=new double[numOfElementsOfDataSet];
protienContentA=new double[numOfElementsOfDataSet];
while (in.hasNext()) {
Ваш код не работает, потому что каждая итерация в цикле while повторно инициализирует массив fatContentA
и protienContentA
преобразует его в пустой массив.
Ответ №2:
Я бы не стал тратить память, используя два массива (списка), и мощность процессора на сортировку этих двух массивов — особенно когда в вашем коде это не требуется.
Вместо этого я бы отслеживал минимальные и максимальные значения для fatContent и proteinContent следующим образом:
double minFat = Double.POSITIVE_INFINITY;
double maxFat = Double.NEGATIVE_INFINITY;
double minProtein = Double.POSITIVE_INFINITY;
double maxProtein = Double.NEGATIVE_INFINITY;
while(in.hasNext()){
String nameOfMammal=in.next();
double fatContent=in.nextDouble();
double protienContent=in.nextDouble();
if (fatContent < minFat) {
minFat = fatContent;
} else if (fatContent > maxFat) {
maxFat = fatContent;
}
if (protienContent < minProtein) {
minProtein = protienContent;
} else if (protienContent > maxProtein) {
maxProtein = protienContent;
}
...
}
Тогда вам не нужно использовать массивы или какую-либо сортировку в этих массивах.
Комментарии:
1. Большое спасибо за ответ на мой вопрос….. Я обязательно попробую то, что вы предложили…. Еще раз спасибо…