繁体   English   中英

用可比的排序(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 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";
    }
}

只需将通用参数从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必须是可比较列表。 如果“被迫”使用对象列表,则必须提供一个Comparator以说明如何比较每个对象:

Collections.sort(randomHumans, humanComparator);

所有这些在官方文档中都有说明:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM