我想知道为什么我在尝试对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>>
我不明白错误的含义以及解决方法。非常感谢您的意见。
答案 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.name
。 name
表示此实例的字段,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
接口。否则,该方法怎么可能知道要排序的标准呢?
答案 4 :(得分:0)
首先,有一个错误,你覆盖Comparable接口方法,“compareTo()”---它应该是小写的“c”,而不是大写。
其次,我不知道你要用最后一点开始做什么,“接口可比较”。删掉那部分 - 你不需要它。
Comparable接口是API的一部分。
干杯。