Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何对不同类类型的对象数组进行排序?_Java_Sorting_Hierarchy_Compareto - Fatal编程技术网

Java 如何对不同类类型的对象数组进行排序?

Java 如何对不同类类型的对象数组进行排序?,java,sorting,hierarchy,compareto,Java,Sorting,Hierarchy,Compareto,我正在尝试开发一个程序,可以对不同类类型的对象数组进行排序,但它们之间的层次结构相同。所有对象都列在我尝试排序的同一数组中,虽然我可以很容易地按字母顺序对同一类型的对象数组进行排序,但我无法想出如何使用相同的数组同时对所有对象进行排序。sort()方法。任何人能提供的任何帮助都将不胜感激 import java.util.Arrays; public class Driver { public static void main(String[] args) { Vehicle[]

我正在尝试开发一个程序,可以对不同类类型的对象数组进行排序,但它们之间的层次结构相同。所有对象都列在我尝试排序的同一数组中,虽然我可以很容易地按字母顺序对同一类型的对象数组进行排序,但我无法想出如何使用相同的数组同时对所有对象进行排序。sort()方法。任何人能提供的任何帮助都将不胜感激

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));