Java 如何对不同类类型的对象数组进行排序?
我正在尝试开发一个程序,可以对不同类类型的对象数组进行排序,但它们之间的层次结构相同。所有对象都列在我尝试排序的同一数组中,虽然我可以很容易地按字母顺序对同一类型的对象数组进行排序,但我无法想出如何使用相同的数组同时对所有对象进行排序。sort()方法。任何人能提供的任何帮助都将不胜感激Java 如何对不同类类型的对象数组进行排序?,java,sorting,hierarchy,compareto,Java,Sorting,Hierarchy,Compareto,我正在尝试开发一个程序,可以对不同类类型的对象数组进行排序,但它们之间的层次结构相同。所有对象都列在我尝试排序的同一数组中,虽然我可以很容易地按字母顺序对同一类型的对象数组进行排序,但我无法想出如何使用相同的数组同时对所有对象进行排序。sort()方法。任何人能提供的任何帮助都将不胜感激 import java.util.Arrays; public class Driver { public static void main(String[] args) { Vehicle[]
import java.util.Arrays;
public class Driver {
public static void main(String[] args) {
Vehicle[] machines = new Vehicle[3];//Example of an array that I can sort
machines[0] = new Vehicle("Giant Robot");
machines[1] = new Vehicle("Time Machine");
machines[2] = new Vehicle("Airplane");
Arrays.sort(machines);
for (int i = 0; i < machines.length; i++)
System.out.println(machines[i].getName());
Vehicle[] vehicles = new Vehicle[7];//example of an array that I cannot sort
vehicles[0] = new Car("Batmobile", 10);
vehicles[1] = new Helicopter("Batcopter", "x");
vehicles[2] = new Car("Jaguar", 6);
vehicles[3] = new Helicopter("RC Copter", "t");
vehicles[4] = new Car("Accelerator", 6);
vehicles[5] = new Helicopter("Stormshadow", "z");
vehicles[6] = new Car("Batmobile", 11);
}
}
**
**
目标:您需要能够将一辆
车辆
与另一辆车辆
进行比较
要实现这个目标:
public class Vehicle implements Comparable<? extends Vehicle> {
....
public int compareTo(Object o) {
// Now, that the Comparable is for the type Vehicle
// you know that o is some kind of vehicle
// check vehicle related things
// number of seats, dogs, whatever
return -1;
}
}
public class Vehicle implements compariable如果要按车辆类型排序,则在对元素排序时需要考虑类类型。修改compareTo()
方法,如下所示:
public int compareTo(Object o){
if ((o != null) &&
(o instanceof Vehicle)){
Vehicle otherVehicle = (Vehicle) o;
return (otherVehicle.getClass().getSimpleName().equals(this.getClass().getSimpleName()) ?
name.compareTo(otherVehicle.name)
: otherVehicle.getClass().getSimpleName().compareTo(this.getClass().getSimpleName()));
}
return -1;
}
您只需将代码调整为:
class Vehicle implements Comparable<Vehicle> {
private String name;
/* ... */
@Override
public int compareTo(Vehicle vehicle) {
return name.compareTo(vehicle.getName());
}
}
类车辆{
私有字符串名称;
/* ... */
@凌驾
公共内部比较(车辆){
返回name.compareTo(vehicle.getName());
}
}
在大多数情况下,您的类不应该实现Compariable
,除非有一个且只有一个排序始终是正确的,比如数字。您的车辆可以按名称、年龄和可能的更多标准进行分类,因此它们不应实现可比性
相反,您可以在实际对车辆进行排序时,将排序函数作为lambda函数传递:
Arrays.sort(machines, (left, right) -> left.getName().compareTo(right.getName()));
或者,相当于:
Arrays.sort(machines, Comparator.comparing(Vehicle::getName));
这样,您就不再需要实现Comparable
。为什么要实现Comparable
而不是Comparable@Tom如果你的问题得到解决,你可以接受/投票表决一个答案,那就太好了。从“接受答案很重要,因为它既可以奖励解决问题的海报,也可以通知其他人你的问题已经解决。”我的问题还没有解决,但我会在我的代码运行后立即投票(希望很快会成功)。@Tom,很难弄清楚你有什么问题,所以你有很多答案,有不同的猜测。你可能想解释为什么这些都不能满足你的要求。我的猜测是不同的——我想你想知道一种叫做“双重分派”的模式:我自己也遇到过这种情况。找到解决方案了吗?o!=null
是多余的,因为instanceof
检查null
对于每个对象,getSimpleName
方法应该只调用一次,以提高性能和可读性默认情况下返回-1
是错误的,因为它通常会防止compareTo
反对称参数类型应为Vehicle
,而不是Object
。
class Vehicle implements Comparable<Vehicle> {
private String name;
/* ... */
@Override
public int compareTo(Vehicle vehicle) {
return name.compareTo(vehicle.getName());
}
}
Arrays.sort(machines, (left, right) -> left.getName().compareTo(right.getName()));
Arrays.sort(machines, Comparator.comparing(Vehicle::getName));