使用可比(Java)

时间:2017-11-06 12:21:55

标签: java sorting comparable

我已经实现了可比较的接口和方法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 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课程:

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";
    }
}

2 个答案:

答案 0 :(得分:3)

只需将通用参数从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);
}

答案 1 :(得分:1)

撰写Collections.sort(randomHumans);时,randomHumans必须是可比较列表。如果你被迫&#39;要使用对象列表,您必须提供Comparator来解释如何比较每个对象:

Collections.sort(randomHumans, humanComparator);

所有这些都在官方文件中解释过: