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

时间:2019-11-25 13:43:48

标签: java arrays file text

我正在努力获取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);

我确定我会忽略各种语法错误,但是我无法全神贯注。

我将不胜感激。

1 个答案:

答案 0 :(得分:0)

您的问题可能是缺少使您的方法过于具体的问题,并且您期望输入的精度太高。

mOrganize中,您明确地读出了新行。但是,最后一行不包含任何换行符,因此失败。

老实说,nextInt会愉快地跳过空格,因此nextLine语句根本不是必需的。 ,如果删除它们,代码就会运行。


mOrganize仅应遵循Java命名约定,而应称为organize,而如果要使其具有任何意义,则应仅将readInventoryFile参数一起使用。 / p>


我不确定您从编程中学到了什么,但是mOrganize中的5和10之类的东西被称为魔术值,应该避免。您真正想要的是创建一个类,例如ItemInventoryItemSales,从其中选出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”不会帮助您进行调试,因为每次运行代码时都需要对其进行恢复。