如何访问用户定义的树集内对象的子字段?

时间:2019-06-29 18:47:27

标签: java compareto treeset

public class Dog extends Animal implements Comparable<Animal> {
    private String name;
    private String breed;
    private boolean isPottyTrained;

public class Frog extends Animal implements Comparable<Animal> {
    private String color;
    private double maxJump;
    private int bugsEatenPerDay;

public class Animal {
    private double weight;
    private double height;
    private double length;

我已经创建了TreeSet类型的Animal。我有两个孩子AnimalDogFrog)。我的目标是按名称顺序设置Dog类的自然顺序,按其颜色(按字母顺序)设置Frog类的自然顺序。

public int compareTo(Animal o) {
        if (o.getClass().equals(Dog.class)) {
            int temp = this.name.compareToIgnoreCase(o.getClass().getName());
            if (temp == 0) {
                return 0;
            } else if (temp > 0) {
                return 1;
            } else {
                return -1;
            }
        }

        return 0;

    } // I am not even sure what is producing

这是我在Dog类中尝试过的代码,但未产生任何结果。

理想情况下,我希望代码类似于

if (this.name > o.getName()) {
...
}  //pseudocode

但是我知道父母不可能访问孩子的领域。有办法解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

如果“孩子”是指子类,则应该能够通过强制转换来访问子类方法,如下所示:

((Dog) o).getName()

仅当将不太具体的类强制转换为它实现的更具体的类时,此方法才起作用,否则它将抛出ClassCastException。

完整的解决方案如下所示:

public int compareTo(Animal o) {
    if (o instanceof Dog) 
        return this.name.compareToIgnoreCase(((Dog) o).getName());
    return 0;
}

但是,此解决方案假定不是狗的所有事物都是平等的,因此您可能还希望为其他动物实现逻辑。

您提到您不知道比较函数将产生什么;它产生的数字表示以下其中一项:

  • 对象小于参数值(<= -1)
  • 该对象“等于”参数值(0)
  • 该对象“大于”参数值(> = 1)

例如,可用于根据您定义的规则对列表进行排序。

答案 1 :(得分:-1)

public int compareTo(Animal o) {

        if (o instanceof Frog) {
            int compare = this.name.compareToIgnoreCase(((Frog) o).getColor());
            if (compare > 0) {
                return 1;
            } else if (compare < 1) {
                return -1;
            } else {
                return 0;
            }
        } else if (o instanceof Dog) {
            int compare = this.name.compareToIgnoreCase(((Dog) o).getName());
            if (compare > 0) {
                return 1;
            } else if (compare < 1) {
                return -1;
            } else {
                return 0;
            }

        }
        return 0;

    }// end compareTo

这在Dog类中。同样的原则也适用于青蛙类