【问题标题】:OOP Java: Creating a stock inventory programOOP Java:创建库存盘点程序
【发布时间】:2012-06-02 01:17:44
【问题描述】:

我对面向对象编程还很陌生,所以我在掌握一些基本概念时仍然有些困难。所以在这里我试图创建一个基本的库存程序来跟踪库存。每只股票都包含几个细节:公司名称、股票评级(AAA、AAa、Aaa 等)、购买价格和股票数量。该程序将要求用户通过命令行提示输入这些详细信息。用户最多只能输入 12 只股票。如果用户两次输入股票,它会打印出一个错误。如果用户输入了两次股票,它也会打印出错误信息。

这是我到目前为止所做的:库存对象

 public class Stock {

private String companyName;
private String stockRating;
private int price;
private int numberOfShares;

public String getCompanyName() {
    return companyName;
}

public int getStockRating() {
    return stockRating;
}

public String getPrice() {
    return price;
}

public int getNumberOfShares() {
    return numberOfShares;
}

public Stock(String companyName, String stockRating, int price, int numberOfShares) {
    super();
    this.companyName = companyName;
    this.stockRating = stockRating;
    this.price = price;
    this.numberOfShares = numberOfShares;
}

现在,我正在尝试创建库存盘点程序

import java.util.*;

public class StockInvetory {

private static final int INVENTORY_SIZE = 12;
private Stock [] stocks;

public StockInvetory() {
    stocks = new Stock [INVENTORY_SIZE];

}

private static void StockInventory() {
       for (int i = 0; i<INVENTORY_SIZE; i++){
         Scanner console = new Scanner(System.in);

    System.out.println ("Stock's name:");
    String stockName = console.next();

    System.out.println ("Stock's rating");
    String stockRating= console.next();

    System.out.println ("Stock's price:");
    int stockPrice = console.nextInt();

    System.out.println ("Numbers of shares: ");
    int numberShares= console.nextInt();

          stocks [i]= new Stock(stockName, stockRatings, stockPrice, numberShares);
    }

public static void main (String [] args){
    StockInventory();



}

}

所以我的问题如下:

第一个库存对象程序应该没问题,我的问题是库存盘点程序。 有了这段代码,private Stock [] 股票,是不是表示股票盘点程序会将信息存储到一个数组中?如果是,我如何将与特定股票、公司名称、价格等相关的所有详细信息存储在一起。我是否必须创建一个多维数组才能跟踪所有细节?就像一行包含有关一只股票的所有详细信息,第二行包含有关另一只股票的详细信息。并且要确定用户是否两次输入了一只股票,我是否使用“equalsIgnoreCase”进行比较?我知道我可能需要为库存创建另一种方法。

非常感谢您的帮助。

【问题讨论】:

    标签: java oop inventory stock


    【解决方案1】:

    读入名称、评级、价格和股数后,您需要调用 Stock 类的构造函数来创建该类的实例并将其分配给 stock[] 数组中的下一项。

    像这样:

    stocks[0] = new Stock( stockName, stockRating, stockPrice, numberShares);
    

    然后,您需要将用于从控制台读取的代码行以及创建新 Stock 对象的代码行放入循环中,以便您可以读取所有 12 只股票:

    for( int i = 0; i < INVENTORY_SIZE; i++ )
    {
        System.out.println ("Stock's name:");
        String stockName = console.next();
    
        System.out.println ("Stock's rating");
        String stockRating= console.next();
    
        System.out.println ("Stock's price:");
        int stockPrice = console.nextInt();
    
        System.out.println ("Numbers of shares: ");
        int numberShares= console.nextInt();
    
        stocks[i] = new Stock( stockName, stockRating, stockPrice, numberShares);
    }
    

    现在,这并不完美,因为它要求用户始终输入完整的 12 只股票,因此您需要弄清楚如何让用户在完成后退出循环,并且您仍然必须添加所需的错误检查,以确保没有输入重复项,但它应该初始化您的各个对象并将每个对象分配给数组元素。

    【讨论】:

    • 您好,我按照您的建议做了,但是在用户输入共享数量后,程序崩溃并输出空指针异常错误。也许我做错了什么。
    【解决方案2】:

    private Stock []库存,是不是表示库存盘点程序 将信息存储到数组中?如果是,我如何存储所有 与特定股票、公司名称、价格等相关的详细信息 在一起。

    您的数组就像list 的股票。但仅仅因为它是一个对象,并不意味着它只包含一个数据。它可以保存字符串、整数和其他用户定义的数据类型。因此,您可以在Stock 对象中存储与股票相关的数据。

    public class Stock {
    
    private String companyName;
    private String stockRating;
    private int price;
    private int numberOfShares;
    

    这些都存储在每个 Stock 对象中,并且可以通过您定义的 getter 方法访问。

    int stockdata = stocks[4].getPrice();

    但是,要初始化 Stock 数组,您需要为每个区域创建一个新的 Stock 对象,如下所示:

    for(int i = 0; i < INVENTORY_SIZE; i++) {
        stocks[i] = new Stock(foo, bar, lorem, ipsum);
    }
    

    此处使用的变量只是占位符,因此您可以像上面一样通过从控制台读取来创建参数。

    These design principles for OOP should help you understand the relationship between data and containers.

    对于问题的第二部分,您可以只比较其中一个数据值,例如companyName,或implementing an interface,例如Comparable

    for(Stock s : stocks) {
        if(stockName.equals(s.getCompanyName()) {
           // ERROR!
        }
    }
    

    【讨论】:

    • 嘿大卫,你有时间看看我更新的代码吗?代码将运行,但在用户输入最后一个详细信息 numberOfshares 后,程序崩溃并输出 nullPointerException 错误。我不确定出了什么问题。
    • 我认为 nullPointerException 是因为您从不创建新的 StockInventory,因此 stock[] 永远不会被初始化。 Frank;\ly,我看不出你的代码是如何编译的,静态方法应该不能引用现场股票。尽量不要将静态方法与对象的字段混淆。
    【解决方案3】:

    如果用户不想输入所有 12 条信息,您可能需要提供一些方法来在特定条件下中断循环。但是,这完全取决于您的要求。 在这种情况下,您可能必须使用其他选项,例如 List 或 vector。

    每个对象都可以有多个变量,例如在您的情况下评级、价格、名称和份额都绑定到每个对象。因此,当您将对象存储在数组的索引中时,您实际上是将该对象包含的所有这些信息存储在一个地方。所以在这种情况下,您不必创建多维数组。

    您可以根据将对象定义为相等的内容覆盖您的 equals 方法,并使用它来确定是否再次提供相同的库存。如果两个对象相同,这将返回 true,否则返回 false。

    您可以在此处发布更新后的代码并登录,以便获得有关您的异常的建议

    【讨论】:

      【解决方案4】:

      在现实世界的场景中,我会想到一些问题:

      • 价格不应该是整数,因为价格通常是特定货币的金额。检查此money related question
      • 使用枚举可以更好地表示股票评级。见doc

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多