gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:29:31 27 4
gpt4 key购买 nike

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”是父类(super class)。

我的问题是我不知道谁会得到一个返回声明,或者是否有另一种聪明的方法来做到这一点?

最佳答案

在我看来,您的代码设计是错误的,或者您应用它的方式错误。由于每个“Värdesak”都有其值(value),因此您可以/需要在 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;
}

}

现在您可以简单地使用动态绑定(bind)原理:

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

关于java - 与具有多个子类的 ArrayList 对象的比较器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29409890/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com