#java #parsing #java.util.scanner
Вопрос:
Я должен прочитать файл и скомпилировать текущие итоги по продавцам, а также их общее количество по каждому отдельному продукту и общее количество по каждому продукту. Я должен хранить все это в 2D-массиве(списки не разрешены) и печатать в определенном формате.
Текстовый файл задокументирован как таковой:
1,4,10.20
2,2,17.20
etc
etc
Столбец 1-идентификатор пользователя, столбец 2-номер продукта, столбец 3-сумма.
Мой код пытается разделить каждую строку на строку, а затем дополнительно разделить каждое значение на индекс, а затем сохранить его в 2D-массиве. Я чувствую себя глупо, но у меня ошибка преобразования. Независимо от того, что я делаю, я не могу сделать объем хранилища массива в приемлемом формате. По какой-то причине я не могу создать массив как двойной. Он возвращается как завершенный, когда я пытаюсь скомпилировать. Мой профессор сказал, что целое число должно работать, и я просто не могу получить точное суммирование.
package HW1;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class salesList {
public static void main(String[] args) throws FileNotFoundException{
Scanner salesList;
salesList = new Scanner(new File("C:\Users\mjwag\OneDrive\cs151/salesList.txt"));
while (salesList.hasNext()) {
Scanner file = salesList;
file.nextLine();
String line = file.nextLine();
String[] lineArray = line.split(",");
int personID = Integer.parseInt(lineArray[0]);
int product = Integer.parseInt(lineArray[1]);
int amount = Integer.parseInt(lineArray[2]);
int [][] sales = new int[4][6];
sales[personID-1][product-1] = amount;
}
}
}
Комментарии:
1. массив продаж создается заново на каждой итерации. держите его вне цикла, чтобы сохранить «изменения» для каждой обработанной строки. Я настоятельно рекомендую привыкнуть к использованию отладчика и пошаговому просмотру кода строка за строкой. Дайте мне знать, если вам нужны какие-либо конкретные рекомендации, и добро пожаловать в мир программирования 🙂
2. Вы имеете в виду создание экземпляра массива вне цикла?
Ответ №1:
Самый простой способ хранить как целые числа , так и двойники в массиве-использовать Number
, который является суперклассом обоих Integer
и Double
. Например:
Number[][] sales = new Number[4][6];
...
sales[0][0] = 1;
sales[0][1] = 4.5;
В качестве альтернативы, как вы обсуждали со своим профессором, можно преобразовать двойное число в целое и потерять числа после десятичной точки. Это можно сделать следующим образом:
double val = 4.5;
int intVal = (int) val;
Комментарии:
1. Я изменил массив на массив чисел и переместил его за пределы цикла, но я получаю следующую ошибку: оператор = не определен для числа типа(ов) аргумента, double. Я изменил сумму на двойную и изменил на парседубль, но теперь я получаю вышеуказанную ошибку
2. Вы можете использовать
Number.intValue()
иNumber.doubleValue()
для полученияint
иdouble
соответственно. Поскольку вы уже знаете, какие значения являются целыми числами, а какие двойными, нет необходимости проверять это.3. Я думаю, что я все еще в замешательстве в контексте моего кода. Я создал массив числового типа, и я просто пытаюсь сохранить информацию со строкой: продажи[PersonID-1][товар-1] = сумма; Вышеупомянутая ошибка-это то, что я не понимаю.
4. Вам придется сделать либо
sales[personID-1][product-1] = sales[personID-1][product-1].intValue() amount;
то, либоsales[personID-1][product-1] = sales[personID-1][product-1].doubleValue() amount;
другое, в зависимости от того, является ли сохраненное значение целым числом или двойным.5. ТАКИМ образом, это, по сути, извлекает последний дубль в указанном слоте и добавляет к нему сумму? Значит, он должен еще больше увеличиться? Теперь я получаю следующую ошибку при попытке назначить приращение. Не удается вызвать «java.lang.Number.doubleValue ()», потому что «продажи[…][…]» равно нулю, я предполагаю, что это связано с тем, что в самой первой строке я пытаюсь извлечь двойник из нуля, который был инициирован вне цикла? Также большое вам спасибо за помощь до сих пор!