在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。我已经写信给每个属性getset 方法。

起初,在我看来,这就像任何其他“在数组中找到最大的项目”问题一样,但我似乎出于某种原因在努力解决这个问题。到目前为止,这是我得出的结论:

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 中的起始部分在物料清单中查找最终项目的方法是啥?数组?递归函数?

Google Apps脚本:查找数组中每个项目的位置

查找最接近未完全排序的列表中的值的项目的索引

比较两个数组并查找第二个数组中缺少的项目[重复]

20172302 《Java软件结构与数据结构》第五周学习总结

使用Linq查找C#通用列表中的最新项目