繁体   English   中英

如何将数组字段重构为 ArrayList

[英]How do I refactor an array field into an ArrayList

这是一个允许用户向系统添加数据的程序。 这特别是程序的清单 class,我们的任务是将 object 清单转换为数组列表的 object ......我是数组列表的新手,我需要一些帮助。

我已经尝试了几次,但到目前为止没有运气,任何帮助!

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;
            }
        }
        if(item.inputCode(scanner))
        {
            if(alreadyExists(item)<0)
            {
                if(item.addItem(scanner))
                {
                    inventory[numItems] = item;
                    numItems++;
                    return true;
                }
                return false;
            }
            else
            {
                System.out.println("Item code already exists");
                return false;
            }
        }
        return true;
    }

    /**
     * Search for a food item and see if it is already stored in the inventory
     * @param item - FoodItem to look for
     * @return - The index of item if it is found, -1 otherwise
     */
    public int alreadyExists(FoodItem item) {
        for(int i=0;i<numItems;i++)
        {
            if(inventory[i].isEqual(item))
                return i;
        }
        return -1;
    }

    /**
     * Update the quanity stored in the food item
     * @param scanner - Input device to use 
     * @param buyOrSell - If we are to add to quantity (<code>true</code>) or remove (<code>false</code>)
     * @return
     */
    public boolean updateQuantity(Scanner scanner, boolean buyOrSell) {
        // If there are no items then we can't update, return
        if(numItems == 0)
            return false;

        FoodItem temp = new FoodItem();
        temp.inputCode(scanner);
        int index = alreadyExists(temp);
        if(index != -1)
        {
            String buySell = buyOrSell?"buy":"sell";
            System.out.print("Enter valid quantity to "+buySell+": ");
            if(scanner.hasNextInt())
            {
                int amount = scanner.nextInt();
                if(amount > 0)
                {
                    return inventory[index].updateItem(buyOrSell? amount: amount*-1);
                }
                else
                {
                    System.out.println("Invalid quantity...");
                }
            }
            else
            {
                System.out.println("Invalid quantity...");
            }
        }
        return false;
    }

    @Override
    public String toString() {
        String returnString = "Inventory:\n";
        for(int i=0;i<numItems;i++)
            returnString += inventory[i].toString() + "\n";
        return returnString;
    }
}

我可能误解了这个问题,但我猜您想将 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)

..您可以从 class 中删除numItems字段。

第三个优点是 List/Collection 支持与您上面的实现非常相似的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 只是在每个项目之间放置逗号。 如果你想保留新行,那么 List/Collection 上的循环比 arrays 稍微简单一些:

   @Override
    public String toString() {
        String returnString = "Inventory:\n";
        for(FoodItem item : inventory) {
            returnString += item.toString() + "\n";
        }
        return returnString;
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM