我正在努力获取Java代码来执行以下操作:
库存更新程序。
第一组记录是主文件,该文件反映了工作日开始时的物料清单。每个主文件记录均包含零件号和相应的物料库存数量。让我们假设主文件包含的记录不超过5条。
第二组记录反映了该天中各个项目的交易。交易记录包含与主文件记录相同的格式:它们包含项目编号和当天售出的相应项目总数。输入文件中没有此类交易记录的数量。
编写一个程序,以根据事务文件更新主文件,以在一天结束时生成新的主文件。库存数量少于10件的任何产品编号都应附带记录通知。
实际文件如下所示。 (Master.txt)
444 40
111 30
222 15
134 20
353 5
第二个看起来像这样(Sales.txt)
134 03
111 29
353 02
222 10
Master.txt的更新版本应如下所示。
444 40
111 1 reorder
222 5 reorder
134 17
353 3 reorder
这是我的代码。
import java.io.*;
import java.util.*;
public class inventoryUpdate {
//Exception included due to mOrganize, sOrganize, and PrintWriter
public static void main(String[] args) throws Exception {
Scanner inKey = new Scanner(System.in);
//Preparing the document based on how many item types were sold.
System.out.println("How many types of products were sold?");
int sold = inKey.nextInt();
int[][] inMaster = fileCheck(mOrganize(), sOrganize(sold), sold);
PrintWriter printFile = new PrintWriter("Master.txt");
printFile.println("Item No. \tQuantity");
for (int i = 0; i<5;i++){
if (inMaster[i][1] < 10){
printFile.printf("%-5s %17s You are low in inventory on this item. Please order more.\n", inMaster[i][0], inMaster[i][1]);
}
else{
printFile.printf("%-5s %17s\n", inMaster[i][0], inMaster[i][1]);
}
}
printFile.close();
System.out.println(Arrays.deepToString(inMaster));
}
private static int[][] mOrganize() throws Exception {
File fileRip = new File("Master.txt");
Scanner masterRead = new Scanner(fileRip);
masterRead.nextLine();
int[][] masterData = new int [5][2];
for (int i = 0; i < 5; i++){
for (int i2 = 0; i2 < 2; i2++){
masterData[i][i2] = masterRead.nextInt();
if (masterData[i][i2] < 10){
masterRead.nextLine();
}
}
}
masterRead.close();
return masterData;
}
private static int[][] sOrganize(int sold) throws Exception{
File fileRip = new File ("Sales.txt");
Scanner saleRead = new Scanner(fileRip);
saleRead.nextLine();
int [][] salesData = new int [sold][2];
for (int i = 0; i < sold; i++){
for (int i2 = 0; i2 < 2; i2++){
salesData[i][i2] = saleRead.nextInt();
}
}
saleRead.close();
return salesData;
}
private static int[][] fileCheck(int[][] master, int[][] sales, int sold){
int columnBase = 0;
for(int i = 0; i < 5; i++){
for(int i2 = 0; i2 < sold; i2++){
if (master[i][columnBase] == sales[i2][columnBase]){
master[i][columnBase + 1] -= sales[i2][columnBase + 1];
}
}
}
return master;
}
}
我的输出如下。
How many types of products were sold?
4
Exception in thread "main" java.util.NoSuchElementException
at java.base/java.util.Scanner.throwFor(Scanner.java:937)
at java.base/java.util.Scanner.next(Scanner.java:1594)
at java.base/java.util.Scanner.nextInt(Scanner.java:2258)
at java.base/java.util.Scanner.nextInt(Scanner.java:2212)
at inventoryUpdate.mOrganize(inventoryUpdate.java:39)
at inventoryUpdate.main(inventoryUpdate.java:14)
代码似乎在第14行中断,并且与我的inMaster数组有关。
int[][] inMaster = fileCheck(mOrganize(), sOrganize(sold), sold);
我确定我会忽略各种语法错误,但是我无法全神贯注。
我将不胜感激。
答案 0 :(得分:0)
您的问题可能是缺少使您的方法过于具体的问题,并且您期望输入的精度太高。
在mOrganize
中,您明确地读出了新行。但是,最后一行不包含任何换行符,因此失败。
老实说,nextInt
会愉快地跳过空格,因此nextLine
语句根本不是必需的。 ,如果删除它们,代码就会运行。
mOrganize
仅应遵循Java命名约定,而应称为organize
,而如果要使其具有任何意义,则应仅将readInventory
与File
参数一起使用。 / p>
我不确定您从编程中学到了什么,但是mOrganize
中的5和10之类的东西被称为魔术值,应该避免。您真正想要的是创建一个类,例如ItemInventory
和ItemSales
,从其中选出Java List
,然后读取文件,直到结束。这样,即使文件中有更多或更少的行,您的代码也可以正常工作。
以下是使用Map
而非List
的高级示例:
private static Map<Integer, Integer> readInventory(File file) throws IOException {
var inventory = new HashMap<Integer, Integer>();
try (var lineScanner = new Scanner(file)) {
while (lineScanner.hasNextLine()) {
// we assume each item is on it's own line
var line = lineScanner.nextLine();
try (var itemScanner = new Scanner(line)) {
var no = itemScanner.nextInt();
var amount = itemScanner.nextInt();
if (inventory.put(no, amount) != null) {
// a more specific exception such as InventoryException might be better
throw new RuntimeException("Duplicate item in inventory file");
}
}
}
}
return inventory;
}
一个商品编号毕竟是唯一的,您不会期望它在同一库存中出现两次。
如您所见,现在很容易将更多信息放在同一行中,尽管这意味着将返回值更改为Map<Integer, Integer>
以外的其他值-例如Map<Item, Integer>
(如果您定义一个新的Item
类。
现在它完全独立于文件中的项目数量,不再有幻数。它也可以从任何文件中读取,而不仅仅是Master.txt
。
我希望很明显,重写“ Master.txt”不会帮助您进行调试,因为每次运行代码时都需要对其进行恢复。