使用可比较 (Java) 排序

Sorting with comparable (Java)

我已经实现了可比接口和方法compareTo()。我有一个名为 randomHumans 的列表,其中包含 10 个对象。 5 个具有三个字段的对象:姓名、年龄和他们开始学习的年份,以及 5 个具有两个字段的对象:姓名和年龄。我想对我的列表进行排序,并尝试使用:

Collections.sort(randomHumans);

这给了我以下错误信息:

The method sort(List<T>) in the type Collections is not applicable for the arguments (ArrayList<Object>)

然后我尝试了这个代码:

Collections.sort((List<T>) randomObjects);

但它只给了我两条新的错误信息。也许我需要指定它应该在哪个字段之后排序,但我找不到如何实现它。任何帮助将不胜感激。

main方法:

public static void main (String[] args) {
    ArrayList<Object> randomObjects = new ArrayList<Object>();
    for (int j=0; j<5; j++) {
        Fysiker randomFysiker = new Fysiker();
        randomObjects.add(randomFysiker);

        Human randomHuman = new Human();
        randomObjects.add(randomHuman);
    }
    System.out.println(randomObjects.toString());

    //Collections.sort(randomObjects);
}

Human class:

class Human implements Comparable<Human> {

    int age;
    String name;

    public Human (int myAge, String myName) {
        name = myName;
        age = myAge;

    }

    public Human() {
        this(randomAge(),randomName());

    }

    public int compareTo(Human o) {
        return this.age - o.age;

    }

    protected static int randomAge() {
        Random randomGenerator = new Random();

        return randomGenerator.nextInt(100);

    }

    protected static String randomName() {
        Random randomGenerator = new Random();

        return "Name"+randomGenerator.nextInt(15);

    }

    public int getAge(){
        return age;
    }

    public String getName() {
        return name;
    }

    public String toString() {
        return "\nName: " + name + "\nAge: " + age + " yrs old\n";
    }


}

Fysiker class:

public class Fysiker extends Human {

    int year;

    public Fysiker(int myAge2, String myName2, int myYear) {

        name = myName2;
        year = myYear+1932;

        if (myAge2 >= 15+(2017-myYear)) {
            age = myAge2;   
        } else {
            age = 15+(2017-year);
        }
    }

    public Fysiker() {
        this(randomAge(),randomName(), randomYear());
    }

    protected static int randomYear() {
        Random randomGenerator = new Random();

        return randomGenerator.nextInt(83);
    }

    public int getYear(){
        return year;
    }

    public String toString() {
        return "\nName: " + name + "\nAge: " + age + " yrs old" + "\nStarted Physics: " + year+"\n";
    }
}

只需将通用参数从 Object 更改为 Human

public static void main (String[] args) {

    List<Human> randomObjects = new ArrayList<>();
    for (int j = 0; j < 5; j++) {

        Fysiker randomFysiker = new Fysiker();
        randomObjects.add(randomFysiker);

        Human randomHuman = new Human();
        randomObjects.add(randomHuman);
    }
    System.out.println(randomObjects);

    Collections.sort(randomObjects);
}

当你写Collections.sort(randomHumans);时,randomHumans必须是一个Comparable列表。如果你'forced'要使用一个List of Object,你必须给出一个Comparator来解释如何比较每个对象:

Collections.sort(randomHumans, humanComparator);

官方文档里都有解释: