是否有为类创建比较器的技巧? [关闭]

问题描述 投票:-2回答:1

我正在测试比较器。这是我的班级项目,其中有两个字段int priceint comments

我通过按升序对price然后按comments进行排序来覆盖compareTo函数

然后,我通过重写compare(Object o1,Object o2)函数来创建自己的比较器。它只是从Item类返回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

    }
java comparator
1个回答
1
投票

这里的问题

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>

© www.soinside.com 2019 - 2024. All rights reserved.