假设我有3个类(Passenger,Pilot,Stewardess)继承自一个名为Persons的抽象类,在一个Persons数组中,我从已定义的3个类中保存了许多这些对象,但后来我想要按以下顺序对人员数组中的这些对象进行排序:
- 来自Passenger类的所有对象
- Pilot类中的所有对象
- 来自Stewardess类的所有对象
如果没有ArrayLists,有没有办法实现这个目标?
答案 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
恰恰相反。
*请注意我为了正确的风格而编辑了代码。