Java 为类创建比较器有什么诀窍吗?
我正在测试比较器。这里有我的类项目,它有两个字段Java 为类创建比较器有什么诀窍吗?,java,comparator,Java,Comparator,我正在测试比较器。这里有我的类项目,它有两个字段int price和int comments 我只需将价格按升序排序,然后按注释即可覆盖比较功能 然后我通过重写compare(Object o1,Object o2)函数来创建自己的比较器。它只需从Item类返回compareTo函数 但结果是,当我将比较器与array.sort(array,new MyComparator())一起使用时,它就不起作用了。我哪里出错了 class Item implements Comparable{
int price
和int comments
我只需将价格按升序排序,然后按注释即可覆盖比较功能
然后我通过重写compare(Object o1,Object o2)函数来创建自己的比较器。它只需从Item类返回compareTo函数
但结果是,当我将比较器与array.sort(array,new MyComparator())
一起使用时,它就不起作用了。我哪里出错了
class Item implements Comparable{
private double price;
private double comments;
public Item(double price, double comments){
this.comments = comments;
this.price = price;
}
@Override
public int compareTo(Object o) {
if (o instanceof Item){
Item item2 = (Item) o;
int priceCompare = Double.compare(this.price, item2.price);
if(priceCompare != 0) {
return priceCompare;
}
return Double.compare(this.comments, item2.comments);
}else{
throw new RuntimeException("Wrong compare Class");
}
}
@Override
public String toString() {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("Items:{").append(" price: ").
append(price).append(" comments: ").append(comments).append(" }");
return stringBuilder.toString();
}
}
这里有问题
if(项目的o1实例和项目的o2实例){
项目1=(项目)o1;
item2=(Item)o1;//此处
返回项目1.比较(项目2);
}否则{
抛出新的RuntimeException(“错误的输入类型”);
}
你应该修这条线
项目2=(项目)o1代码>
由此
项目2=(项目)o2代码>
此外,使用通用版本的接口避免将所有这些冗长的代码转换为Item、instanceOf..
所以Comparable
和这Comparator
这一行:Item item2=(Item)o1代码>包含输入错误:应该是o2
。旁注:。
class MyComparator implements Comparator {
@Override
public int compare(Object o1, Object o2) {
System.out.println("asdasd");
if (o1 instanceof Item && o2 instanceof Item) {
Item item1 = (Item) o1;
Item item2 = (Item) o1;
return item1.compareTo(item2);
} else {
throw new RuntimeException("Wrong input type");
}
}
}
@Test
public void test3Comparator() {
Item[] items = new Item[]{new Item(65, 70),
new Item(45, 7),new Item(98, 89),
new Item(23, 56),new Item(78, 90)};
System.out.println(Arrays.toString(items));
Arrays.sort(items, new MyComparator());
System.out.println(Arrays.toString(items)); // Still shows the original order
}