#java #arrays #file #arraylist
#java #массивы #файл #arraylist
Вопрос:
Я пытаюсь решить проблему, которая принимает в качестве входных данных файл, содержащий данные о 5 странах, например: товары, проданные yadayada…. Я пытаюсь прочитать из файла и подсчитать общую прибыль для каждой страны. В настоящее время я прочитал входные данные из файла, нашел индексы названий стран и прибыли для стран (каждая страна и прибыль находятся в одном и том же индексе во всем файле CSV). Затем я начал просматривать каждую строку и сравнивать, является ли строка одной из 5 стран. Если в индексе строки указано название страны, скажем, «Соединенные Штаты Америки», индекс, содержащий прибыль, должен быть добавлен в список стран. Моя проблема сейчас заключается в том, что списки массивов, которые я пытаюсь создать для каждой страны, хранят значения для всех прибылей (как я и хотел), но затем постоянно повторяются, и окончательный список массивов состоит из разных массивов (я не знаю, как это выразить).).
Списки выглядят следующим образом [1234 12341 1241231 1231 3123 124123 123 123 123 ], [3123 123 112358723 8398172 8123 ], []…..
когда я хочу, чтобы они выглядели как [1234, 1234,1234,1234,1234,1234,1234,1234]
Я не знаю, почему список массивов снова и снова копирует значения в разные индексы, но в этом суть моей проблемы.
Оттуда я должен взять эти значения, суммировать их для каждой страны и распечатать их в выходной файл, с которым, как мне кажется, я могу справиться.
Мой CSV-файл выглядит примерно так,
Сегмент, Страна, Продукт, диапазон скидок, проданные единицы, Цена производства, Цена продажи, валовые продажи, Скидки, Продажи, COGS, Прибыль, Дата, номер месяца, Название месяца, год Правительство, Канада, Карретера, Нет ,1618.5,3,20,32370,0,32370,16185,16185,1/1/2014,1, Январь 2014 года Правительство, Германия, Carretera, Нет ,1321,3,20,26420,0,26420,13210,13210,1/1/2014,1, Январь 2014 года Midmarket, Франция, Carretera , Нет ,2178,3,15,32670,0,32670,21780,10890,1/6/2014,6, Июнь , 2014 год Средний рынок, Германия, Carretera , Нет ,888,3,15,13320,0,13320,8880,4440,1/6/2014,6, Июнь , 2014 год Средний рынок, Мексика, Карретера, Нет ,2470,3,15,37050,0,37050,24700,12350,1/6/2014,6, Июнь , 2014 год Правительство, Германия, Carretera, Нет ,1513,3,350,529550,0,529550,393380,136170,1/12/2014,12, Декабрь 2014 года Средний рынок, Германия, Монтана , Нет ,921,5,15,13815,0,13815,9210,4605,1/3/2014,3, Март 2014 года
И мой код до сих пор выглядит так :
public static void main(String[] args) throws IOException {
Scanner in = new Scanner(new File("sample-csv-file-for-testing-fixed.csv"));
PrintWriter pw = new PrintWriter(new File("Output.csv"));
// gets first line of file
String firstline = in.nextLine();
firstline.trim();
String data = firstline.replaceAll(" ", "");
String[] header = data.split(",");
// find index of Country and Profit and store them into variables
String country = "Country";
String profit = "Profit";
int index1 = 0, index2 = 0;
for (int i = 0; i < header.length; i ) {
if (header[i].equals(country)) {
index1 = i;
}
}
for (int i = 0; i < header.length; i ) {
if (header[i].equals(profit)) {
index2 = i;
}
}
//System.out.println(index1 " " index2);
// arrays for each country
ArrayList<String> USA = new ArrayList<String>();
ArrayList<String> France = new ArrayList<String>();
ArrayList<String> Germany = new ArrayList<String>();
ArrayList<String> Mexico = new ArrayList<String>();
while (in.hasNextLine()) {
String line = in.nextLine();
String nextline = line.replaceAll(" ", "");
String[] values = nextline.split(",");
// find what country the line has
if (values[index1].equals("United States of America")) {
USA.add(values[index2]);
} else if (values[index1].equals("France")) {
France.add(values[index2]);
} else if (values[index1].equals("Germany")) {
Germany.add(values[index2]);
} else if (values[index1].equals("Mexico")) {
Mexico.add(values[index2]);
}
// test prints
// System.out.print(USA );
//System.out.print("n" France " ");
//System.out.print("n" Germany " ");
//System.out.println("n" Mexico " ");
}
}
Комментарии:
1. пожалуйста, не публикуйте только) изображения кода или данных, необходимых для ответа на ваш вопрос. Пожалуйста, отправьте пример данных в виде текста в самом вопросе.
2. Как вы это отладили? Кажется вероятным, что вы не анализируете столбцы в файле CSV так, как вы думаете. Вы печатали / использовали точку останова, чтобы увидеть, что
values[index2]
на самом деле, прежде чем добавлять ее в country ArrayList?3. Извините за экранную шапку. Потребовалось время, чтобы что-то опубликовать. Я обновил вопрос примером с использованием текста
4. @wolfcastle я вижу, в чем проблема со списком массивов. у меня была печать списка массивов внутри моего цикла while, поэтому он повторялся снова и снова для каждого повторяющегося значения стран. Спасибо, что указали мне на это
Ответ №1:
Вероятно, можно было бы сделать это немного лучше, чем то, как я это сделал, но в конце концов я понял это
public static void main(String[]args)throws IOException{
Scanner in = new Scanner(new File("sample-csv-file-for-testing-fixed.csv"));
PrintWriter pw = new PrintWriter(new File("Output.csv"));
// gets first line of file
String firstline = in.nextLine();
firstline.trim();
String data = firstline.replaceAll(" ","");
String[] header = data.split(",") ;
// find index of Country and Profit and store them into variables
String country = "Country";
String profit = "Profit";
int index1 =0 , index2=0;
for(int i = 0;i < header.length;i ){
if(header[i].equals(country)){
index1 = i;
}
}
for(int i = 0;i<header.length;i ){
if(header[i].equals(profit)){
index2 = i;
}
}
// Create arraylists for each country
ArrayList<String> USA = new ArrayList<String>();
ArrayList<String> France = new ArrayList<String>();
ArrayList<String> Germany = new ArrayList<String>();
ArrayList<String> Mexico = new ArrayList<String>();
ArrayList<String> Canada = new ArrayList<String>();
while( in.hasNextLine()){
String line = in.nextLine();
String nextline = line.replaceAll(" ","");
String[] values = nextline.split(",");
//Finding lines with each country
if(values[index1].contains("United")){
USA.add(values[index2]);
}
else if(values[index1].equals("France")){
France.add(values[index2]);
}
else if(values[index1].equals("Germany")){
Germany.add(values[index2]);
}
else if(values[index1].equals("Mexico")){
Mexico.add(values[index2]);
}
else if(values[index1].equals("Canada")){
Canada.add(values[index2]);
}
}
// call method and store values into double array lists;
ArrayList<Double> france_results = getIntegerArray(France);
ArrayList<Double> germany_results = getIntegerArray(Germany);
ArrayList<Double> USA_results = getIntegerArray(USA);
ArrayList<Double> mexico_results = getIntegerArray(Mexico);
ArrayList<Double> canada_results = getIntegerArray(Canada);
// call method to sum values in ArrayLists
double sumUSA = getSum(USA_results);
double sumFrance = getSum(france_results);
double sumGermany = getSum(germany_results);
double sumMexico = getSum(mexico_results);
double sumCanada = getSum(canada_results);
// Print to Output.CSV file
pw.print("France , " sumFrance "n"
"Germany ," sumGermany "n"
"Canada ," sumCanada "n"
"United States of America ," sumUSA "n"
"Mexico , " sumMexico);
pw.close();
}
// Method to conver String ArrayList to Integer ArrayLists
public static ArrayList<Double> getIntegerArray(ArrayList<String> stringArray){
ArrayList<Double> values = new ArrayList<Double>();
for(String stringValue : stringArray){
values.add(Double.parseDouble(stringValue));
}
return values;
}
// method to sum the index of each ArrayList
public static double getSum(ArrayList<Double> doubleArray){
double sum = 0;
for(int i = 0; i< doubleArray.size();i ){
sum = sum doubleArray.get(i);
}
return sum;
}