Java 找出最便宜的商品
我对Java和Eclipse还是新手。我应该通过泛型类找出列表中最便宜的项,并打印出它的参数。我有这个:Java 找出最便宜的商品,java,eclipse,Java,Eclipse,我对Java和Eclipse还是新手。我应该通过泛型类找出列表中最便宜的项,并打印出它的参数。我有这个: public class Store<T extends Item>{ public List<T> items = new ArrayList<T>(); public void addItem(T it){ items.add(it); } public T cheapestItem(){ T cheapes
public class Store<T extends Item>{
public List<T> items = new ArrayList<T>();
public void addItem(T it){
items.add(it);
}
public T cheapestItem(){
T cheapest;
Collections.sort(items, (i1, i2) -> i1.getPrice().compareTo(i2.getPrice()));
cheapest = Collections.min(items,null);
return cheapest;
}
}
不幸的是,我不确定我做错了什么,因为Eclipse并没有在运行前指出这一点。谁能给我指一下正确的方向吗?还有其他方法吗?最好的解决方案是在
min
方法中使用比较器,而不是null。这应该允许它得到你需要的结果-如果比较器不知道如何比较项目,它就不能得到最小值!您可以删除对排序的调用,并将比较器添加到对min
的调用中。它看起来是这样的:
public T cheapestItem(){
return Collections.min(items, (i1, i2) -> i1.getPrice().compareTo(i2.getPrice()));
}
如果返回的是最昂贵的而不是最便宜的,只需将比较顺序从
t1.compareTo(t2)
更改为t2.compareTo(t1)
您的异常显示T
必须实现Comparable
,才能使用方法Collections.min
。您可以在未显示的项定义中向编译器“证明”(并确保其为真)。声明Item实现Comparable
,并确保那里有一个compareTo
方法。我要做的是创建一个局部变量,它存储找到的最便宜的项并遍历列表
public T cheapestItem() {
T cheapest = items.get(0);
for (T item : items) {
if (item.getPrice() < cheapest.getPrice()) {
cheapest = item;
}
}
}
public T cheapestItem(){
T最便宜=物品。获取(0);
对于(T项:项){
if(item.getPrice()
您正在对列表进行排序,虽然它没有用,但使用了正确的比较器。然后调用min(),您必须这样做,但使用null作为比较器。这在技术上是正确的。但更好的解决方案是继续使用min(),使用正确的比较器(在无用的sort()中使用),并删除sort。查找最小值比对整个列表排序要快,Collections.min()更清楚地表达了意图。@jbnize如果你是对的,那么效率会稍微高一些-我编辑了我的答案。最后一部分是不必要的。这将是最便宜的。比较器可以简化为“comparator.comparing”(Item::getPrice)。
public T cheapestItem(){
return Collections.min(items, (i1, i2) -> i1.getPrice().compareTo(i2.getPrice()));
}
public T cheapestItem() {
T cheapest = items.get(0);
for (T item : items) {
if (item.getPrice() < cheapest.getPrice()) {
cheapest = item;
}
}
}