Не удается правильно ввести отсканированную строку в 2D-массив

#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 ()», потому что «продажи[…][…]» равно нулю, я предполагаю, что это связано с тем, что в самой первой строке я пытаюсь извлечь двойник из нуля, который был инициирован вне цикла? Также большое вам спасибо за помощь до сих пор!