具有多个子类的ArrayList对象的比较器

时间:2015-04-02 09:48:53

标签: java swing return-value comparator

public class WorthComparator implements Comparator<Värdesak> {
    public int compare(Värdesak v1, Värdesak v2) {
        if (v1 instanceof Apparat && v2 instanceof Apparat) {
            return ((Apparat) v1).worth() > ((Apparat) v2).worth() ? 1
                    : ((Apparat) v1).worth() < ((Apparat) v2).worth() ? -1
                            : 0;
        } else if (v1 instanceof Smycke && v2 instanceof Smycke) {
            return ((Smycke) v1).worth() > ((Smycke) v2).worth() ? 1
                    : ((Smycke) v1).worth() < ((Smycke) v2).worth() ? -1
                            : 0;
        } else if (v1 instanceof Aktie && v2 instanceof Aktie) {
            return ((Aktie) v1).worth() > ((Aktie) v2).worth() ? 1
                    : ((Aktie) v1).worth() < ((Aktie) v2).worth() ? -1 : 0;
        }
    }
}

正如您所看到的,我正在尝试比较ArrayList中的不同对象,然后在GUI中按最高值对它们进行排序。每个不同的对象(“Smycke”,Aktie,Apparat“)都在各自的子类中,每个子类都有一个估算其值的方法。”Värdesak“是超类。

我的问题是,我不知道我会向谁收到回复声明,还是有另一种聪明的方法可以做到这一点?

3 个答案:

答案 0 :(得分:1)

在我看来,您的代码设计是错误的,或者您以错误的方式应用它。由于每个“Värdesak”都值得一试,您可以/需要在Värdesak级别定义此方法:

public abstract class Värdesak {

    public abstract double worth ();

}

然后:

public class Apparat extends Värdesak {

    @Override
    public double worth () {
        return 500.0d;
    }

}

如果价格固定,您可以使用字段:

public abstract class Värdesak {

    private double value;

    public double worth () {
        return worth;
    }

}

现在您只需使用动态绑定原则:

public class WorthComparator implements Comparator<Värdesak> {

    public int compare(Värdesak v1, Värdesak v2) {
        return Double.compare(v1.worth(),v2.worth());
    }

}

instanceof calls are in general considered to be a bad smell:如果你必须使用它们,那么你的代码设计通常会出现问题。

另一个建议是,请不要在标识符中使用unicode字符:使用Vardesak代替Värdesak

答案 1 :(得分:1)

感谢所有好评。真的很适合它!我知道Unicode,当我清理代码时它肯定会被修复。你的意思是你重写的超类(值())中的“通用”方法会解决我的问题吗? 谢谢

答案 2 :(得分:0)

您也可以让Värdesak实现Comparable接口

public abstract class Värdesak implements Comparable<Värdesak> {
    //[...] your code
}

现在为每个类compareTo

定义Värdesak
public class Smycke extends Värdesak {

    //[...] your code

    @Override
    public int compareTo(Server o) {
        // TODO: your compare logic
        return 0;
    }
}

稍后您可以通过以下方式对Värdesaks进行排序:Collections.sort(värdesakList)

编辑:注意,此解决方案不像Comparator模式那么灵活。