#java #excel #csv #file #file-io
#java #excel #csv #файл #file-io
Вопрос:
Когда я запускаю тестовую программу, она просто возвращает нули вместо лет. Я не могу понять, почему. Похоже, статистика вычисляется правильно. Мне нужно, чтобы он отображал годы для диапазона прироста населения вместо этих нулей. И за годы для минимальных и максимальных значений для конкретных преступлений. Вот код на данный момент (3 файла):
/**
* File: USCrimeClass.java
* Author: Noah Smith
* Date: 11/16/2020
* Purpose: To create a class to parse crime data
*/
public class USCrimeClass {
// Crime data fields for each data to retrieve
private int year;
private double populationGrowth;
private int maxMurderYear;
private int minMurderYear;
private int maxRobberyYear;
private int minRobberyYear;
//Crime data constructor to set variables
public USCrimeClass(int year, int populationGrowth, int maxMurderYear, int minMurderYear, int maxRobberyYear, int minRobberyYear){
this.year = year;
this.populationGrowth = populationGrowth;
this.maxMurderYear = maxMurderYear;
this.minMurderYear = minMurderYear;
this.maxRobberyYear = maxRobberyYear;
this.minRobberyYear = minRobberyYear;
}
// Constructor defaults
public USCrimeClass(int i){
this.year = 0;
this.populationGrowth = 0.0;
this.maxMurderYear = 0;
this.minMurderYear = 0;
this.maxRobberyYear = 0;
this.minRobberyYear = 0;
}
//Getter methods for each field
public int getYear() {return this.year; }
public double getPopulationGrowth() {return this.populationGrowth; }
public int getMaxMurderYear() {return this.maxMurderYear; }
public int getMinMurderYear() {return this.minMurderYear; }
public int getMaxRobberyYear() {return this.maxRobberyYear; }
public int getMinRobberyYear() {return this.minRobberyYear; }
// Setter method for each field
public void setYear(int year) {this.year = year;}
public void setPopulationGrowth(double populationGrowth) {this.populationGrowth = populationGrowth;}
public void setMaxMurderYear(int maxMurders) {this.maxMurderYear = maxMurders;}
public void setMinMurderYear(int minMurders) {this.minMurderYear = minMurders;}
public void setMaxRobberyYear(int maxRobbery) {this.maxRobberyYear = maxRobbery;}
public void setMinRobberyYear(int minRobbery) {this.minRobberyYear = minRobbery;}
}
/**
* File: USCrimeFile.java
* Author: Noah Smith
* Date: 11/16/2020
* Purpose: Access Crime.csv and create methods to calculate stats
*
*/
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class USCrimeFile {
public static USCrimeClass[] read(String filename){
// Array declaration
USCrimeClass[] stats = new USCrimeClass[20];
Scanner inputReader = null;
// Variable declaration
int count = 0;
String line;
// Access Crime.csv and create array
try{
inputReader = new Scanner(new File(filename));
// Read first line
inputReader.nextLine();
while (inputReader.hasNext()) {
line = inputReader.nextLine();
String[] data = line.split(",");
stats[count] = new USCrimeClass(Integer.parseInt(data[0]));
stats[count].setPopulationGrowth(Integer.parseInt(data[1]));
stats[count].setMaxMurderYear(Integer.parseInt(data[4]));
stats[count].setMinMurderYear(Integer.parseInt(data[4]));
stats[count].setMaxRobberyYear(Integer.parseInt(data[8]));
stats[count].setMinRobberyYear(Integer.parseInt(data[8]));
count ;
}
return stats;
}
catch (FileNotFoundException e) {
e.printStackTrace();
return null;
}
finally {
inputReader.close();
}
}
// Method calculation for population growth rate
public void populationGrowth(USCrimeClass[] data){
double growthRate;
System.out.println("Population growth rate: ");
for (int i = 0; i < data.length - 1; i ){
growthRate = 100 * (float) (data[i 1].getPopulationGrowth() - data[i].getPopulationGrowth()) / data[i].getPopulationGrowth();
System.out.println("From " data[i].getYear() " to " data[i 1].getYear() " the population growth was " String.format("%.4f", growthRate) "%");
}
}
// Method to find year with highest murder rate
public String maxMurderYear(USCrimeClass[] data) {
int iSize = data.length;
double currentMurderRate = 0.00;
double mMurderRate;
int murderHighYear = 0;
String stReturnValue;
// Access array
try {
for (int i = 0; i < iSize; i ) {
// Get murder rate
mMurderRate = data[i].getMaxMurderYear();
if (mMurderRate < currentMurderRate) {
murderHighYear = data[i].getYear();
}
currentMurderRate = mMurderRate;
}
stReturnValue = "The murder rate was highest in " murderHighYear ".";
return stReturnValue;
}
catch(Exception e){
System.out.println("Exception" e.getMessage());
return null;
}
}
// Method to find lowest murder year
public String minMurderYear(USCrimeClass[] data) {
int iSize = data.length;
double currentMurderRate = 0.00;
double mMurderRate;
int murderLowYear = 0;
String stReturnValue;
try {
// Access array
for (int i = 0; i < iSize; i ) {
// Get the murder rate
mMurderRate = data[i].getMinMurderYear();
if (mMurderRate > currentMurderRate) {
murderLowYear = data[i].getYear();
}
currentMurderRate = mMurderRate;
}
stReturnValue = "The murder rate was lowest in " murderLowYear ".";
return stReturnValue;
}
catch (Exception e) {
System.out.println("Exception" e.getMessage());
return null;
}
}
// Get the year with highest robberies
public String maxRobberyYear(USCrimeClass[] data) {
int iSize = data.length;
double currentRobberyRate = 0.00;
double dRobberyRate;
int robberyHighYear = 0;
String stReturnValue;
// Access array
try {
for (int i = 0; i < iSize; i ) {
// Get the robbery rate
dRobberyRate = data[i].getMaxRobberyYear();
if (dRobberyRate < currentRobberyRate) {
robberyHighYear = data[i].getYear();
}
currentRobberyRate = dRobberyRate;
}
stReturnValue = "The robbery rate was highest in " robberyHighYear ".";
return stReturnValue;
}
catch (Exception e) {
System.out.println("Exception" e.getMessage());
return null;
}
}
// Method to find lowest robbery year
public String minRobberyYear(USCrimeClass[] data) {
int iSize = data.length;
double currentRobberyRate = 0.00;
double dRobberyRate;
int robberyLowYear = 0;
String stReturnValue;
// Access array
try {
for (int i = 0; i < iSize; i ) {
// Get robbery rate
dRobberyRate = data[i].getMinRobberyYear();
if (dRobberyRate > currentRobberyRate) {
robberyLowYear = data[i].getYear();
}
currentRobberyRate = dRobberyRate;
}
stReturnValue = "The robbery rate was lowest in " robberyLowYear ".";
return stReturnValue;
}
catch (Exception e) {
System.out.println("Exception" e.getMessage());
return null;
}
}
}
/**
* File: TestUSCrime.java
* Author: Noah Smith
* Date: 11/16/2020
* Purpose:
*/
import java.util.Scanner;
public class TestUSCrime {
static Scanner input = new Scanner(System.in);
public static void main(String[] args) {
//Reference USCrimeFile
USCrimeFile oUSCrimeFile = new USCrimeFile();
USCrimeClass[] data = USCrimeFile.read("Crime.csv");
//Declare variables
long startTime = System.currentTimeMillis();
long endTime;
String userSelect;
while (true) {
// Welcome prompt
System.out.println("******** Welcome to the US Crime Statistical Application********n");
System.out.println("n" "Enter the number of the question you want answered. Enter 'Q' to quit the program:n");
System.out.println("1. What were the percentages in population growth for each consecutive year from 1994-2013?");
System.out.println("2. What year was the murder rate the highest?");
System.out.println("3. What year wat the murder rate the lowest?");
System.out.println("4. What year was the robbery rate the highest?");
System.out.println("5. What year was the robbery rate the lowest?");
System.out.println("Q. Quit the program");
System.out.println("nEnter your selection: ");
userSelect = input.nextLine();
System.out.println();
switch (userSelect){
case "1":
oUSCrimeFile.populationGrowth(data);
break;
case "2":
System.out.println("The murder rate was highest in " oUSCrimeFile.maxMurderYear(data));
break;
case "3":
System.out.println("The murder rate was lowest in " oUSCrimeFile.minMurderYear(data));
break;
case "4":
System.out.println("The robbery rate was highest in: " oUSCrimeFile.maxRobberyYear(data));
break;
case "5":
System.out.println("The robbery rate was highest in: " oUSCrimeFile.minRobberyYear(data));
break;
case "Q":
System.out.println("nThank you for trying the US Crime Statistics Program");
endTime = System.currentTimeMillis();
System.out.println("nElapsed time in seconds was: " (endTime - startTime) / 1000 "seconds.");
System.exit(0);
}
}
}
}
Комментарии:
1. На 99% уверен, что это связано с методом getYear()
Ответ №1:
Мне пришлось добавить параметр для года. Это решило эту проблему, однако возникли некоторые другие проблемы, связанные с типами данных, которые я решил позже.
while (inputReader.hasNext()) {
line = inputReader.nextLine();
String[] data = line.split(",");
stats[count] = new USCrimeClass(Integer.parseInt(data[0]));
stats[count].setPopulationGrowth(Integer.parseInt(data[1]));
stats[count].setYear(Integer.parseInt(data[0]));
stats[count].setMaxMurderYear(Integer.parseInt(data[4]));
stats[count].setMinMurderYear(Integer.parseInt(data[4]));
stats[count].setMaxRobberyYear(Integer.parseInt(data[8]));
stats[count].setMinRobberyYear(Integer.parseInt(data[8]));
count ;
}