我正在做一个java项目,我遇到了这个问题而且不知道如何修复它。
我的项目中的类(简化):
public class Item {
private String itemID;
private Integer price;
public Integer getPrice() {
return this.price;
}
}
public class Store {
private String storeID;
private String address;
}
public class Stock {
private Item item;
private Store store;
private Integer itemCount;
public Integer getInventoryValue() {
return this.item.getPrice() * this.itemCount;
}
}
然后我尝试对ArrayList
股票进行排序,以便创建另一个名为CompareByValue
的类
public class CompareByValue implements Comparator<Stock> {
@Override
public int compare(Stock stock1, Stock stock2) {
return (stock1.getInventoryValue() - stock2.getInventoryValue());
}
}
当我尝试运行程序时,会出现错误:
线程“main”中的异常java.lang.ClassCastException:Stock无法强制转换为java.lang.Comparable
任何人都知道什么是错的?
答案 0 :(得分:12)
这是因为Stock
没有实施Comparable
。实现它:
public class Stock implements Comparable<Stock> {
public int compareTo(Stock o) {
// ...
}
}
...或者将CompareByValue
的实例作为参数传递给sort()
方法:
Collections.sort(list, new CompareByValue());
答案 1 :(得分:0)
仅从上面的代码,它看起来很好。你确定上面代码中的例外吗? 如果您只将Stock对象放入任何已排序的集合中,您将看到此类异常并需要实现Comparable接口。
但是对于只是通过自定义Comparator的情况,您不需要使Stock成为Comparable。就像你给匿名的Comparator实现一样。
将比较器设置为像TreeSet这样的已排序集合,然后将stock对象添加到sorted集合中,它应该可以在不实现Comparable接口的情况下工作。
答案 2 :(得分:0)
public class Student implements Comparator<Student> {
private String name;
private String surname;
private int matpaz;
private int progrpaz;
private int anglupaz;
private double average;
@Override
public int compare(Student o1, Student o2) {
String v1 = o1.surname;
String v2 = o2.surname;
if ((v1.compareTo(v2)) >0) return 1;
else return 0;
}
public static void alphabetically (Student[] s)
{
Arrays.sort(s);
System.out.printf(Arrays.toString(s));
}
}