【问题标题】:Not sure how to return a Class in java不知道如何在java中返回一个类
【发布时间】:2018-12-12 23:21:02
【问题描述】:

我有这门课

public class Bid {
private User buyer;
private double bidValue;

public Bid(User buyer, double bidValue) {
  if(buyer == null || bidValue <1) {
  throw new IllegalArgumentException();
}

this.buyer = buyer;
this.bidValue = bidValue;
}

public User getBuyer() {
 return buyer;
}


public double getBidValue() {
return bidValue;
}

public String toString() {
 return this.buyer + " bid £" + this.bidValue;
 }

}

还有这个类

import java.util.*;

public class Product {
private int productId;
private String productName;
private double reservedPrice;
private List<Bid> bids = null;

public Product(int productId, String productName, double reservedPrice) {
  this.productId = productId;
  this.productName = productName;
  this.reservedPrice = reservedPrice;
  this.bids = new ArrayList<Bid>();
}


public Bid getHighestBid() {
  double max = 0.0;
  for(Bid bidValue :bids) {
    if(bidValue.getBidValue() > max) 
    max = bidValue.getBidValue();
   }
  return null;
 }


}

在 getHighestBid 方法中,我试图确定用户放置的最高唯一出价,但是我不太确定如何做到这一点,因为返回类型必须是 Bid 并且我不断得到该最大值无法解析为键入双。虽然我明白这意味着什么,但我不知道如何解决它。

【问题讨论】:

  • 在 for 循环之外声明一个竞价变量(如 max),然后在 if 语句中声明 bid = bidValue(在 max=bidValue.getBidValue 之后)。然后返回出价。

标签: java class arraylist


【解决方案1】:
public Bid getHighestBid() {
  Bid max = null;
  for(Bid bidValue :bids) {
    if(max==null || bidValue.getBidValue() > max.getBidValue()) 
    max = bidValue;
   }
  return max;
}

您必须存储 Bid 对象,而不仅仅是值,然后对其进行检查。

【讨论】:

  • 哈哈,刚看到
  • 好的简单的答案,也很容易理解,因为他只是一个初学者,但你可以进一步改进它,如何?好吧,您可以通过设置Bid max = bids.get(0); 和简单的检查if(bidValue.getBidValue() &gt; max.getBidValue()) 而不是if(max==null || bidValue.getBidValue() &gt; max.getBidValue()) 来避免检查max==null
  • 你说得对,我想我的思维过程是不要让他感到困惑,而是要检查第一个值(可以改为 for 循环,但同样,我不想做很多变化)。
  • 一个实际的索引forforeach 循环更容易理解,主要是因为索引,所以它实际上会提高他的理解(在我看来)。同样检查第一个值实际上同样令人困惑,因此在对原始解决方案进行最小修改的情况下给出两者中最有效的答案总是理想的。无论哪种方式,我都赞成你的,因为它是最容易理解的,无需太多修改。
【解决方案2】:

如果你“只是想修复你的代码”,你可以使用类似

public Bid getHighestBid() {
  double max = 0.0;
  Bid maxBid = null;
  for(Bid bid : bids) {
    if(bid.getBidValue() > max) 
    max = bid.getBidValue();
    maxBid = bid;
  }
  return maxBid;
}

但您应该更进一步,实施Comparableinterface 进行投标:

public class Bid implements Comparable<Bid> {
   ...    
   int compareTo (Bid other) {
      // return -1,0 or 1 depending on comparison of bid Values of this and other
   }

}

那么,在你的Productclass 中,你可以

public Bid getHighestBid() {
  return Collection.max(bids);
}

这种方法使用内置的比较和排序功能。而且通常更具可读性..

【讨论】:

  • 我不会实现 Comparable - 自然排序顺序有点不自然,并且与任何合理的 equals 不一致。来自 API 文档“强烈建议(尽管不是必需的)自然排序与 equals 一致。”。
【解决方案3】:
public Bid getHighestBid() {
    double max = Double.NEGATIVE_INFINITY;
    Bid maxBid = null;
    for (Bid bid : bids) {
        double bidValue = bidValue.getBidValue();
        if (bidValue > max) {
            max = bidValue;
            maxBid = bid;
        }
     }
     return maxBid;
 }

注意事项:

也许允许负值,即使它在构造函数中受到限制。严格来说,可能都是NaN

double max = 0.0;

每个出价都是一个出价,而不是一个出价。

for(Bid bidValue :bids) {

只需保留最高出价对象及其值即可。 (您每次都可以获得该值,但如果您不这样做,看起来会更干净。)

流版本类似于:

return bids.stream()
    .max(Comparator.comparingDouble(Bid::getBidValue)).orElse(null);

(和往常一样,我没有编译这段代码)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-06
    • 1970-01-01
    • 1970-01-01
    • 2020-08-15
    • 1970-01-01
    • 1970-01-01
    • 2014-11-28
    • 2016-07-16
    相关资源
    最近更新 更多