有没有为类创建比较器的技巧



我正在测试比较器。这里我有我的Class Item,它有两个字段int priceint comments

我只需按照价格的升序排序,然后按注释来覆盖compareTo函数

然后,我通过覆盖compare(Object o1,Object o2(函数来创建自己的Comparator。它只是从Item Class返回compareTo函数

但结果是,当我使用Arrays.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();
}
}
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
}

此处的问题

if (o1 instanceof Item && o2 instanceof Item) {
Item item1 = (Item) o1;
Item item2 = (Item) o1; //HERE
return item1.compareTo(item2);
} else {
throw new RuntimeException("Wrong input type");
}

你应该修理这条线路

Item item2 = (Item) o1;

通过这个

Item item2 = (Item) o2;

此外,使用通用版本的接口来避免编写所有这些冗长的代码cast to Item, instanceOf..

所以Comparable<Item>和这个Comparator<Item>

最新更新