找出最便宜的物品

时间:2016-11-02 22:29:39

标签: java eclipse

我还是Java和Eclipse的新手。我应该通过泛型类找出列表中最便宜的项目并打印出它的参数。我有这个:

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

public class Test {

    public static void main(String[] args) throws JSONException {
        String data = "[{\"_id\":\"\",\"read\":false,\"timestamp\":\"\",\"unix_time\":1477924542020},"
                + "{\"_id\":\"\",\"read\":false,\"timestamp\":\"\",\"unix_time\":1477924542121},"
                + "{\"_id\":\"\",\"read\":false,\"timestamp\":\"\",\"unix_time\":1477924532440}]";

        JSONArray jArray = new JSONArray(data);
        System.out.println(jArray);

        JSONArray newJArray = new JSONArray(data);

        JSONObject jsonObj;
        for (int i = 0; i < jArray.length(); i++) {
            jsonObj = (JSONObject) jArray.get(i);

            jsonObj.put("new_unix_time", jsonObj.remove("unix_time"));

        }
        System.out.println(jArray);
    }
}

在我的主要活动中:

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());

不幸的是,我不确定我做错了什么,因为Eclipse在运行之前没有指出它。有人能指出我正确的方向吗?还有另一种方法可以做到这一点吗?

3 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:-1)

您的例外情况表明T必须实施Comparable才能使用Collections.min方法。你在未显示的Item定义中向编译器“证明”了这一点(并确保它是真的)。声明Item implements Comparable并确保那里有compareTo方法。