Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Java中的销售值更新库存系统文件_Java_Arrays_File_Text - Fatal编程技术网

使用Java中的销售值更新库存系统文件

使用Java中的销售值更新库存系统文件,java,arrays,file,text,Java,Arrays,File,Text,我正在努力让我的Java代码执行以下操作: 库存更新程序 第一组记录是主文件,反映工作日开始时的项目库存。每个主文件记录都包含一个零件号和相应的物料库存量。假设主文件包含的记录不超过5条 第二组记录反映了当天各种项目的交易情况。交易记录包含与主文件记录的格式相同:它们包含项目编号和当天销售的相应项目总数。输入文件中存在未知数量的此类事务记录 编写一个程序,根据事务文件更新主文件,以便在一天结束时生成新的主文件。如果库存中的物品数量少于10件,则应随附记录通知 实际文件如下所示。(Master.t

我正在努力让我的Java代码执行以下操作:

库存更新程序

第一组记录是主文件,反映工作日开始时的项目库存。每个主文件记录都包含一个零件号和相应的物料库存量。假设主文件包含的记录不超过5条

第二组记录反映了当天各种项目的交易情况。交易记录包含与主文件记录的格式相同:它们包含项目编号和当天销售的相应项目总数。输入文件中存在未知数量的此类事务记录

编写一个程序,根据事务文件更新主文件,以便在一天结束时生成新的主文件。如果库存中的物品数量少于10件,则应随附记录通知

实际文件如下所示。(Master.txt)

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;
}