1 回答
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;
}
添加回答
举报