【问题标题】:Update Inventory system file with sales values in Java使用 Java 中的销售值更新库存系统文件
【发布时间】:2019-11-25 13:43:48
【问题描述】:

我正在努力让我的 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);

我确信我忽略了某种语法错误,但我没能解决这个问题。

如果有任何帮助,我将不胜感激。

【问题讨论】:

  • 感谢您的解释!对此我很抱歉,我已经相应地编辑了我的问题。感谢您的帮助。
  • 读取文件时,您同时读取整行和 int by int,选择一个或另一个,但不要同时使用

标签: java arrays file text


【解决方案1】:

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

mOrganize 中,您明确地读取了新行。但是,最后一行不包含任何换行符,所以它失败了。

老实说,nextInt 很乐意跳过空格,所以nextLine 语句都不是必需的,如果你删除它们,你的代码就会运行。


如果你遵循 Java 命名约定,mOrganize 应该被称为 organize,如果你想让它有意义,则应该只将 readInventoryFile 参数命名为。


我不确定您在编程方面学到了多少,但mOrganize 中的 5 和 10 之类的东西被称为 magic values,应该避免使用。你真正想要的是创建一个类,例如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&lt;Integer, Integer&gt; 以外的值 - 例如 Map&lt;Item, Integer&gt; 如果您定义了一个新的 @987654337 @类。

它现在完全独立于文件中的项目数量,不再有幻数。它还可以读取任何文件,而不仅仅是Master.txt


我希望很明显,重写“Master.txt”不会帮助您进行调试,因为您需要在每次运行代码时恢复它。

【讨论】:

  • 非常感谢您如此。这帮助很大。我不知道地图的概念,但它是无价的。感谢您的深入回应
猜你喜欢
  • 2011-12-24
  • 2023-02-01
  • 2015-09-24
  • 2014-10-23
  • 2014-12-26
  • 2021-03-23
  • 2012-12-10
  • 1970-01-01
  • 2022-06-18
相关资源
最近更新 更多