使用Comparable,Java

时间:2016-01-17 00:00:57

标签: java sorting comparable

这里的第一个计时器,这里有一个问题Java代码:          import java.util。*;

public class Pootis
{
public static void main(String[] args)
{   
    Superhero batman = new Superhero("Bruce", 26, "Batman");
    Human rachel = new Human("Rachel", 24);
    Superhero ironman = new Superhero("Tony", 35, "Ironman");
    Human pepper = new Human("Pepper", 22);



    List<Human> people = new ArrayList<>();
    people.add(batman);
    people.add(rachel);
    people.add(ironman);
    people.add(pepper);

    Collections.sort(people);//<-----
    }
}

此程序的目的是按年龄对人员ArrayList中的人员进行排序。我正在使用类似的界面。问题似乎是在调用Collections.sort(人员)时。我做错了什么?? 这是第二堂课:

public class Human implements Comparable<Human> {
private int age;
private String name;

public Human(String givenName, int age) {
    this.name = givenName;
    this.age = age;
}
@Override
public int compareTo(Human other){
    if(getAge() > other.getAge()){
        return 1;
    }
    else if(getAge() < other.getAge()){
        return -1;
    }
    return 0;
}


public String getName() {
    return name;
}

public int getAge() {
    return age;
}


}

这是错误:

Pootis.java:65:错误:找不到合适的排序方法(列表)         Collections.sort(人);                    ^     方法Collections.sort(List,Comparator)不适用       (无法从参数实例化,因为实际和形式参数列表的长度不同)     方法Collections.sort(List)不适用       (推断类型不符合声明的界限)         推断:对象         bound(s):可比较)   其中T#1,T#2是类型变量:     T#1扩展了在方法排序中声明的Object(List,Comparator)     T#2扩展了方法排序(List)中声明的Comparable 1错误

这是超级英雄课程:

public class Superhero {
String alterEgo, name;
int age;

public Superhero(String givenName, int age, String alterEgo) {
    super();
    this.alterEgo = alterEgo;
    this.name = givenName;
    this.age = age;
}

public String getAlterEgo() {
    return alterEgo;
}
public String introduce() {
    return "Hey! I'm " + name + " and I'm " + age + " years old. I'm also known as" + alterEgo + "!";
}
}

2 个答案:

答案 0 :(得分:1)

Collections.sort()的签名是:

public static <T extends Comparable<? super T>> void sort(List<T> list)

这意味着您只能在sort个对象列表上调用Comparable。使用List<Object>无效,因为Object不是Comparable。 <{1}}超载

sort()

但这不适用于您的方法调用,因为您只提供了一个参数。

请记住,根据javadoc,为了使用public static <T> void sort(List<T> list, Comparator<? super T> c) 对列表进行排序,所有元素必须相互比较。在您的情况下,这意味着您应该有一种方法可以将Collections.sort()Human进行比较。另外,如果Superhero,您的列表应声明为Superhero extends Human(或反之亦然)。

答案 1 :(得分:0)

如果Superhero延长Human,您的列表应该是

List<Human> persons = new ArrayList<>();

因为如果您以其他方式执行此操作,则列表中的对象属于Object类型,因此无法进行比较,因为compareTo中已覆盖Human