我还是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在运行之前没有指出它。有人能指出我正确的方向吗?还有另一种方法可以做到这一点吗?
答案 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
方法。