在java中的项目数组中查找最昂贵的项目
Posted
技术标签:
【中文标题】在java中的项目数组中查找最昂贵的项目【英文标题】:Find the most expensive item in an array of items in java 【发布时间】:2019-09-13 10:12:07 【问题描述】:所以我做了一些作业,其中我有一个班级FoodItem
和班级Stock
。在“Stock”类中,有一个 FoodItem
(_stock
) 数组和数组中当前位置的整数 (_noOfFoodItems
)。
其中一项任务是找到数组中最昂贵的项(FoodItem
的类属性之一是int _price
)。另一条指令是,如果数组为空,则该方法应返回null
。我已经写信给每个属性get
和set
方法。
起初,在我看来,这就像任何其他“在数组中找到最大的项目”问题一样,但我似乎出于某种原因在努力解决这个问题。到目前为止,这是我得出的结论:
public FoodItem mostExpensive()
if (_noOfFoodItems == 0)
return null;
FoodItem mostExpensiveFoodItem = _stock[0];
for (int i = 0 ; i< _noOfFoodItems; i++)
if (_stock[i].getPrice() > mostExpensiveFoodItem.getPrice())
mostExpensiveFoodItem = new FoodItem(_stock[i]);
return mostExpensiveFoodItem;
我真的不知道出了什么问题。大学告诉我们使用的 IDE 中没有调试功能,而且代码对我来说似乎很好。
我已经对其进行了测试,该方法返回了第一项,而不是最昂贵的一项。
你能告诉我我做错了什么吗? 如果您认为错误与代码的其他部分有关,请告诉我要添加的部分。
提前谢谢你!
编辑
我在方法中使用的导体如下:
public FoodItem(FoodItem otherFoodItem)
this._name = otherFoodItem.getName();
this._catalogueNumber = otherFoodItem.getCatalogueNumber();
this._quantity = otherFoodItem.getQuantity();
this._prodactionDate = otherFoodItem.getProdactionDate();
this._expiryDate = otherFoodItem.getExpiryDate();
this._minTemperature = otherFoodItem.getMinTemperature();
this._maxTemperature = otherFoodItem.getMaxTemperature();
我的测试主要:
public static void Main (String[] Args)
Stock s = new Stock();
s.addItem(new FoodItem ("milk", 1111, 5, new Date (30, 5, 2003), new Date (31, 5, 2003), -16, 22, 17 ));
s.addItem(new FoodItem ("milk", 1111, 3, new Date (30, 5, 2003), new Date (31, 5, 2003), -16, 22, 17 ));
s.addItem(new FoodItem ("bread", 1112, 2, new Date (7, 6, 2001), new Date (13, 6, 2002), -7, 1, 13 ));
s.addItem(new FoodItem ("corn", 1113, 1, new Date (30, 5, 2001), new Date (30, 5, 2000), -16, 22, 18 ));
s.addItem(new FoodItem ("soup", 1111, 5, new Date (30, 5, 2003), new Date (31, 5, 2003), -16, 22, 17 ));
s.addItem(new FoodItem ("hot dog", 1114, 201, new Date (30, 5, 2007), new Date (31, 5, 2003), 7, 5, 1 ));
System.out.println(s.mostExpensive().getName());
“常规”构造函数:
public FoodItem (String name, long catalogueNumber, int quantity, Date prodactionDate, Date expiryDate, int minTemperature, int maxTemperature, int price)
this._name = name;
this._catalogueNumber = catalogueNumber;
this._quantity = quantity;
this._price = price;
if(prodactionDate.before(expiryDate))
this._expiryDate = prodactionDate.tomorrow();
else
this._expiryDate = expiryDate;
if(minTemperature > maxTemperature)
this._minTemperature = maxTemperature;
this._maxTemperature = minTemperature;
else
this._minTemperature = minTemperature;
this._maxTemperature = maxTemperature;
【问题讨论】:
第一项是最贵的食物吗? @Geek 不,他是第二贵的FoodItem
您的代码要么永远不会进入循环,要么永远不会进入 If 条件。它是如此简单。尝试使用 _stock[1] 初始化 mostExpensiveFoodItem 并查看它返回的是第 0 个元素还是第一个元素。如果它返回第一个元素,则问题出在循环或如果条件如果它返回第 0 个元素,则第 0 个元素是最大的元素。试试看。
您的指挥没有价格属性?添加它,否则它可能会将默认值初始化为 Price。
@Geek 我将添加我的测试 Main。
【参考方案1】:
当库存中的下一个项目更昂贵时,您正在创建一个新的 FoodItem,但您希望将 mostExpensiveFoodItem 设为库存中的下一个项目。
变化:
mostExpensiveFoodItem = new FoodItem(_stock[i]);
到
mostExpensiveFoodItem = _stock[i];
如果这不是错误,我不明白为什么代码错误,所以它可能在其他地方
为您的构造函数编辑
用于复制 FoodItem 的构造函数不会设置价格,因此如果您创建一个新的 FoodItem,则价格等于 null,因此第一个 FoodItem 始终具有最高价格,因为它是您定期创建的唯一一个。
改变你的构造函数:
public FoodItem(FoodItem otherFoodItem)
this._name = otherFoodItem.getName();
this._catalogueNumber = otherFoodItem.getCatalogueNumber();
this._quantity = otherFoodItem.getQuantity();
this._prodactionDate = otherFoodItem.getProdactionDate();
this._expiryDate = otherFoodItem.getExpiryDate();
this._minTemperature = otherFoodItem.getMinTemperature();
this._maxTemperature = otherFoodItem.getMaxTemperature();
//ADD THIS
this._price = otherFoodItem.getPrice();
【讨论】:
这是他们告诉我们用于将一个FoodItem
分配给另一个的承包商。它只是将参数中的所有值复制到新的FoodItem
你可以在你的帖子中添加构造函数吗?【参考方案2】:
您的 FoodItem 构造函数中缺少 int _price。因此,_stock[i].getPrice() > mostExpensiveFoodItem.getPrice() 永远不会为真,并且每次都返回数组的第一个元素。
【讨论】:
【参考方案3】:我会像下面这样重写您的mostExpensive
,这可以帮助您自己找到问题。
public FoodItem mostExpensive(double highestPrice, FoodItem[] stock)
if (stock == null || stock.length == 0)
return null;
FoodItem mostExpensiveFoodItem = stock[0];
for (int i = 0 ; i < stock.length; i++)
if (stock[i].getPrice() > highestPrice)
mostExpensiveFoodItem = stock[i];
return mostExpensiveFoodItem;
【讨论】:
但这需要参数并且指令说没有参数。 在这种情况下,我会将Comparable
实现到FoodItem
类中,然后使用Collections.sort()
并在两行代码中获得最昂贵的项目。
我希望...但是我们不能使用任何扩展方法,除了 Math
类以上是关于在java中的项目数组中查找最昂贵的项目的主要内容,如果未能解决你的问题,请参考以下文章
用 Access 中的起始部分在物料清单中查找最终项目的方法是啥?数组?递归函数?