使用Collections.sort()时出错

时间:2015-07-01 21:50:09

标签: java sorting comparator comparable

我想知道为什么我在尝试对List进行排序后会出现错误。 当我尝试对包含" Student"的列表进行排序时,会发生错误。对象。

import java.lang.reflect.Array;
import java.util.*;
import java.util.ArrayList;

public class mainProgram {
    public static void main(String[] args) {
        List<Student> classStudents = new ArrayList<Student>();

    //Add 4 students to List
        classStudents.add(new Student("Charles", 22));
        classStudents.add(new Student("Chris", 25));
        classStudents.add(new Student("Robert", 23));
        classStudents.add(new Student("Adam", 21));

    //sort and print
        Collections.sort(classStudents);    //Why does this not work?
        System.out.println("classStudent(Sorted) ---> "
        + Arrays.toString(classStudents.toArray()));
    }
}
class Student implements Comparable<Student>{
    // fields
    private String name;
    private int age;

    //Constructor
    public Student(String name, int age){ 
        name = name;
        age = age;
        }
    //Override compare
    public int CompareTo(Student otherStudent){
        if(this.age == otherStudent.age){
            return 0;
        } else if(this.age < otherStudent.temp){
            return -1;
        } else{
            return 1;
        }
    }

    //Override toString
    public String toString(){
        return this.name + " " + this.age;
    }
}
interface Comparable<Student>{
    int CompareTo(Student otherStudent); 
    String toString();
}

错误是:

Bound mismatch: The generic method sort(List<T>) of type Collections is not applicable for the arguments (List<Student>). The inferred type Student is not a valid substitute for the bounded parameter <T extends Comparable<? super T>>

我不明白错误的含义以及解决方法。非常感谢您的意见。

5 个答案:

答案 0 :(得分:8)

根据错误消息可能不是那么明显,但是如果你看一下documentation of Collection.sort,你会发现这个方法(就像其他标准API方法一样)需要实现已定义的实例列表在API接口中,在本例中为java.lang.Comparable

因此,请勿尝试创建自己的 string = """{'prop1': 'foo' , 'prop2': [1,2,3], 'prop3': [12,3]} """ def _validate_schema(blob): schema = {'prop1': str, 'prop2': list, 'prop3': list} if blob.keys() in schema.keys(): for k, v in blob.iteritems(): if isinstance(v, schema[k]): continue raise ValueError("Bad schema: \ Expected: %s, \ Got: %s \ " % (schema, blob)) # Usage try: jsn = json.loads(string) _validate_schema(jsn) except ValueError: raise ValueError(' bad json format') 界面。请记住,如果某些方法需要某种类型,则必须已在某处定义此类型(否则,使用此类方法的类将无法编译,因为方法无法使用某些未知/未定义类型)。

同样比较Comparable中定义的方法是java.util.Comparable而不是compareTo(Java区分大小写,因此这些方法不会被视为相等)。

其他问题是

  • CompareTo没有Student字段,所以

    temp

    应该是

    } else if (this.age < otherStudent.temp) {
    

    甚至更好,而不是} else if (this.age < otherStudent.age) { 比较条件age只需使用

    if(..<..){-1} else if(..==..){0} else {1}
  • 在构造函数中,您需要return Integer.compare(age, otherStudent.age); 来确定您引用的this.namename表示此实例的字段,this.name是对传递给构造函数的变量的引用。所以你需要

    name

答案 1 :(得分:2)

做了一些小改动,看看:

<强> MainProgram.java

node.js

<强> Student.java

    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.Collections;
    import java.util.List;

    public class MainProgram {

        public static void main(String[] args) {
            System.out.println("HI !!!");
            List<Student> classStudents = new ArrayList<Student>();

        //Add 4 students to List
            classStudents.add(new Student("Charles", 22));
            classStudents.add(new Student("Chris", 25));
            classStudents.add(new Student("Robert", 23));
            classStudents.add(new Student("Adam", 21));

        //sort and print
            Collections.sort(classStudents);    //Why does this not work?
            System.out.println("classStudent(Sorted) ---> "
            + Arrays.toString(classStudents.toArray()));
        }
    }

输出: classStudent(已排序)---&gt; [Adam 21,Charles 22,Robert 23,Chris 25]

答案 2 :(得分:1)

Java定义了自己的Comparable接口。删除你的并导入theres,collections方法使用java。

答案 3 :(得分:0)

如果要对其进行排序,您的Student类需要实现java.lang.Comparable接口。否则,该方法怎么可能知道要排序的标准呢?

这应该有用:Why should a Java class implement comparable?

答案 4 :(得分:0)

首先,有一个错误,你覆盖Comparable接口方法,“compareTo()”---它应该是小写的“c”,而不是大写。

其次,我不知道你要用最后一点开始做什么,“接口可比较”。删掉那部分 - 你不需要它。

Comparable接口是API的一部分。

干杯。