为了账号安全,请及时绑定邮箱和手机立即绑定

如何将数组字段重构为 ArrayList

如何将数组字段重构为 ArrayList

翻过高山走不出你 2023-11-10 17:13:48
这是一个允许用户向系统添加数据的程序。这具体是程序的库存类,我们的任务是将对象库存转换为数组列表的对象...我是数组列表的新手,我需要一些帮助来解决这个问题。我已经尝试了几次,但到目前为止还没有运气,任何帮助!public class Inventory {    /**     * List of FoodItems that represents our inventory     */    private FoodItem[] inventory;    /**     * Number of items that a user has entered     */    private int numItems;    /**     * Default Constructor     */    public Inventory() {        inventory = new FoodItem[20];    }    /**     * Reads from the Scanner object passed in and fills the data member fields of the class with valid data.     * @param scanner - Scanner to use for input     * @return <code>true</code> if all data members were successfully populated, <code>false</code> otherwise     */    public boolean addItem(Scanner scanner) {        if(numItems == 20)        {            System.out.println("Inventory full");            return false;        }        boolean valid = false;        FoodItem item = null;        while(!valid)        {            System.out.print("Do you wish to add a fruit(f), vegetable(v) or a preserve(p)? ");            if(scanner.hasNext(Pattern.compile("[fFvVpP]")))            {                String choice = scanner.next();                switch(choice.toLowerCase())                {                case "f":                    item = new Fruit();                    break;                case "v":                    item = new Vegetable();                    break;                case "p":                    item = new Preserve();                    break;                default: // Should not get here.                    item = new FoodItem();                    break;                }                valid = true;            }            else            {                System.out.println("Invalid entry");                scanner.next();                valid = false;            }        }
查看完整描述

1 回答

?
慕丝7291255

TA贡献1859条经验 获得超6个赞

我可能误解了这个问题,但我猜你想将 Inventory 转换为使用ArrayList,而不是将其转换ArrayList。那是对的吗?

如果我正确理解了这个问题,那么您要做的第一件事就是将字段的声明更改inventory为 ArrayList:

private List<FoodItem> inventory;

请注意,我已将其声明为 List 接口,而不是具体的 ArrayList 实现。除非您需要的 ArrayList 实现的特定功能在通用接口中不可用,否则通常最好在通用接口级别进行操作,以便为自己提供最大的灵活性。

但是,在构造函数中,您实际上将实例化具体的 ArrayList:

public Inventory() {
    inventory = new ArrayList<>(20);
}

通过从裸数组切换到 ArrayList,您将发现使用 Collection 的第一个优点,因为您将不再需要该方法alreadyExists()。List 及其超级接口 Collection 支持该contains()方法。

这:

if(alreadyExists(item)<0)

变成:

if (!inventory.contains(item))

...并且您可以删除该alreadyExists()方法。

第二个优点是您不再需要将库存中的商品数量作为单独的字段进行跟踪。List 已经为您提供了这一点。

这:

if(numItems == 20)

变成:

if (inventory.size() == 20)

..并且您可以numItems从班级中删除该字段。

第三个优点是列表/集合支持toString()与上面的实现非常相似的。

这:

  @Override

    public String toString() {

        String returnString = "Inventory:\n";

        for(int i=0;i<numItems;i++)

            returnString += inventory[i].toString() + "\n";

        return returnString;

    }

变成:


   @Override

    public String toString() {

        return "Inventory:\n" + inventory.toString();

    }

toString() 和 List 提供的 toString() 之间的主要区别在于每个项目之间有换行符,而 List 只是在每个项目之间放置逗号。如果你想保留新行,那么列表/集合上的循环比数组稍微麻烦一点:


   @Override

    public String toString() {

        String returnString = "Inventory:\n";

        for(FoodItem item : inventory) {

            returnString += item.toString() + "\n";

        }

        return returnString;

    }


查看完整回答
反对 回复 2023-11-10
  • 1 回答
  • 0 关注
  • 68 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信