使用Java中的销售值更新库存系统文件
我正在努力让我的Java代码执行以下操作: 库存更新程序 第一组记录是主文件,反映工作日开始时的项目库存。每个主文件记录都包含一个零件号和相应的物料库存量。假设主文件包含的记录不超过5条 第二组记录反映了当天各种项目的交易情况。交易记录包含与主文件记录的格式相同:它们包含项目编号和当天销售的相应项目总数。输入文件中存在未知数量的此类事务记录 编写一个程序,根据事务文件更新主文件,以便在一天结束时生成新的主文件。如果库存中的物品数量少于10件,则应随附记录通知 实际文件如下所示。(Master.txt)使用Java中的销售值更新库存系统文件,java,arrays,file,text,Java,Arrays,File,Text,我正在努力让我的Java代码执行以下操作: 库存更新程序 第一组记录是主文件,反映工作日开始时的项目库存。每个主文件记录都包含一个零件号和相应的物料库存量。假设主文件包含的记录不超过5条 第二组记录反映了当天各种项目的交易情况。交易记录包含与主文件记录的格式相同:它们包含项目编号和当天销售的相应项目总数。输入文件中存在未知数量的此类事务记录 编写一个程序,根据事务文件更新主文件,以便在一天结束时生成新的主文件。如果库存中的物品数量少于10件,则应随附记录通知 实际文件如下所示。(Master.t
44440
111 30
222 15
134 20
353 5
第二个看起来像这样(Sales.txt)
134 03
111 29
353 02
222 10
Master.txt的更新版本应该是这样的
44440
111 1重新订购
2225重新订购
134 17
353 3重新订购
这是我的密码
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;
}
}
代码似乎在第14行中断,与我的inMaster数组有关
int[][] inMaster = fileCheck(mOrganize(), sOrganize(sold), sold);
我肯定我忽略了某种语法错误,但我没能把我的头脑集中在它上面
如果有任何可能的帮助,我将不胜感激。您的问题可能是您的方法不够具体,而且您对输入的精度要求过高 在
mOrganize
中,您正在显式地读取新行。但是,最后一行不包含任何换行符,因此失败
老实说,nextInt
愉快地跳过了空白,因此根本不需要nextLine
语句,如果删除它们,代码将运行
如果您遵循Java命名约定,则应调用
mOrganize
,如果您想让它有意义,则应使用File
参数调用readInventory
我不确定您对编程了解多少,但是
mOrganize
中的5和10之类的东西被称为神奇值,应该避免。您真正想要的是创建一个类,例如itemnocentory
和ItemSales
,从中创建一个Java列表
,然后读取文件直到结束。这样,即使文件中有更多或更少的行,代码也可以工作
这里有一个更高级的示例,它使用映射
而不是列表
:
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;
}
private static Map readInventory(文件)引发IOException{
var inventory=newhashmap();
try(var lineScanner=新扫描仪(文件)){
while(lineScanner.hasNextLine()){
//我们假设每个项目都在它自己的行中
var line=lineScanner.nextLine();
try(var itemScanner=newscanner(行)){
var no=itemScanner.nextInt();
var amount=itemScanner.nextInt();
if(存货.卖出(否,金额)!=null){
//更具体的异常(如InventoryException)可能更好
抛出新的RuntimeException(“库存文件中的重复项”);
}
}
}
}
退货库存;
}
一个项目编号毕竟是唯一的,你不会期望它在同一个库存中出现两次
如您所见,现在很容易在同一行中放置更多信息,尽管这意味着将返回值更改为Map
以外的值-例如,如果您定义了一个新的项
类,则将返回值更改为Map
它现在完全独立于文件中的项目数量,不再有神奇的数字。它还可以读取任何文件,而不仅仅是Master.txt
我希望很明显,重写“Master.txt”不会帮助您进行调试,因为您需要在每次运行代码时恢复它。感谢您的解释!很抱歉,我已经相应地编辑了我的问题。感谢您的帮助。在阅读文件时,您同时阅读整行和逐int,请选择其中一行或另一行,但不要同时使用这两行。谢谢。这帮了大忙。我不知道地图的概念,但它是无价的。我感谢你的深入回复
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;
}