有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java查找最便宜的商品

我对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 cheapest;

        Collections.sort(items, (i1, i2) -> i1.getPrice().compareTo(i2.getPrice()));

        cheapest = Collections.min(items,null);

        return cheapest;

}


}

在我的主要活动中:

Store<Item> store = new Store<>();

for (int i = 0; i < items.size(); i++) {
            store.addItem(items.get(i).getA());
            store.addItem(items.get(i).getB());
}

System.out.println("Cheapest item price is " + store.cheapestItem().getPrice());

我收到一条错误消息:

Exception in thread "main" java.lang.ClassCastException:  com.java.school.B cannot be cast to java.lang.Comparable
at java.util.Collections.min(Unknown Source)
at java.util.Collections.min(Unknown Source)
at com.java.school.Store.cheapestItem(Store.java:20)
at com.java.school.Main.main(Main.java:313)

不幸的是,我不确定我做错了什么,因为Eclipse并没有在运行前指出这一点。谁能给我指一下正确的方向吗?还有别的办法吗


共 (3) 个答案

  1. # 1 楼答案

    最好的解决方案是在min方法中使用比较器,而不是null。这应该允许它得到你需要的结果-如果比较器不知道如何比较项目,它就不能得到最小值!您可以删除对sort的调用,并将comparator添加到对min的调用中。它看起来是这样的:

    public T cheapestItem(){
        return Collections.min(items, (i1, i2) -> i1.getPrice().compareTo(i2.getPrice()));
    }
    

    如果返回的是最昂贵的而不是最便宜的,只需将比较顺序从t1.compareTo(t2)更改为t2.compareTo(t1)

  2. # 2 楼答案

    您的异常显示T必须实现Comparable才能使用方法Collections.min。您可以在未显示的Item定义中向编译器“证明”这一点(并确保它是真的)。声明Item implements Comparable并确保那里有一个compareTo方法

  3. # 3 楼答案

    我要做的是创建一个局部变量,它存储找到的最便宜的项目并遍历列表

    public T cheapestItem() {
        T cheapest = items.get(0);
        for (T item : items) {
            if (item.getPrice() < cheapest.getPrice()) {
                cheapest = item;
            }
        }
    }