排序多态数组

时间:2015-06-19 02:32:42

标签: java arrays sorting polymorphism

假设我有3个类(Passenger,Pilot,Stewardess)继承自一个名为Persons的抽象类,在一个Persons数组中,我从已定义的3个类中保存了许多这些对象,但后来我想要按以下顺序对人员数组中的这些对象进行排序:

- 来自Passenger类的所有对象

- Pilot类中的所有对象

- 来自Stewardess类的所有对象

如果没有ArrayLists,有没有办法实现这个目标?

2 个答案:

答案 0 :(得分:2)

Arrays.sort(personArray, new Comparator<Person>() {

    @Override
    public int compare(Person p1, Person p2) {
        int person1Index = getOrderIndex(p1);
        int person2Index = getOrderIndex(p2);

        if (person1Index < person2Index) {
            return -1;
        } else if (person1Index > person2Index) {
            return 1;
        } else {
            return 0;
        }
    }

    private int getOrderIndex(Person p) {
        if (p == null) {
            return 0;
        } else if (p instanceof Passenger) {
            return 1;
        } else if (p instanceof Pilot) {
            return 2;
        } else if (p instanceof Stewardess) {
            return 3;
        } else {
            throw new RuntimeException("Unexpected person type: " + p.getClass().getName());
        }
    }
});

答案 1 :(得分:0)

如果我正确理解了您的问题,那么您正在尝试按类型对从Person继承的对象数组进行排序。是的,这可以做到。

Person[] people = new Person[]; //this creates a new array of Person's

您可以使用许多不同的技术对此数组进行排序,但您需要能够识别每个Person的特定类型。这可以通过反射来实现:

for (int i = 0; i < people.length; i++) {
  String s = people[i].getClass().getSimpleName();
  //do whatever you need to do
}

另一种方法是在原始帖子的评论中提出,如果你对3种类型进行冒泡排序,我认为这样做更好:

让Person实现Comparable接口。然后,在每个子类中实现compareTo方法,如下所示:

修改:样式编辑。我们希望此特定比较仅适用于Person而不是Object s。

class Pilot extends Person {
  public int compareTo(Person o) {
    if (o instanceof Passenger)
        return 1;
    else if (o instanceof Stewardess)
        return -1;
    return 0;
  }
}

class Passenger extends Person {
  public int compareTo(Person o) {
    if (o instanceof Passenger)
      return 0; //if the two objects are equal from the perspective
                //of our comparison, it is proper form to return 0
    return -1;
  }
}

class Stewardess extends Person {
  public int compareTo(Person o) {
    if (o instanceof Stewardess)
      return 0;
    return 1;
  }
}

现在,即使您有三个类,也可以直接比较任意两个对象并获得可用于排序的值(&lt; 0向左移动,&gt; 0向右移动)。

修改澄清(评论空间不足)

compareTo()方法就像看起来一样简单。幕后没有任何魔力。它正在做的是提供一个间接级别,允许我们比较不同类型的对象,就好像它们是相同的。在对集合中的对象进行排序的情况下(在比较级别),我们不关心类型或关于对象属性的任何其他信息。我们只需要知道对象A是应该在对象B之前还是在对象B之后。compareTo()方法用作自定义比较操作,我们可以应用于任何Person对象,它将告诉我们该对象是否应该在它被比较的对象之前或之后,没有别的。 Passenger.compareTo()将始终返回-1,因为Passenger将在每个其他类型之前出现。 Stewardess恰恰相反。

*请注意我为了正确的风格而编辑了代码。