最近在学Java,后续尝试用Java在云服务器上做个项目,手里的服务器是借助阿里云免费套餐活动开通的,先定一个小目标。
不过在做一个年龄排序题目的时候,JDK7版本运行抛出异常:Comparison method violates its general contract。
下面是代码:
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class SortTest {
static class Student {
//姓名
String name;
//年龄
int age;
//性别
String sex;
public Student(String name, int age, String sex) {
super();
this.name = name;
this.age = age;
this.sex = sex;
}
/**
* @return the name
*/
public String getName() {
return name;
}
/**
* @return the age
*/
public int getAge() {
return age;
}
/**
* @return the sex
*/
public String getSex() {
return sex;
}
@Override
public String toString() {
return "name:" + name + ",age:" + age + ",sex:" + sex;
}
}
/**
* @param args
*/
public static void main(String[] args) {
System.setProperty("java.util.Arrays.useLegacyMergeSort", "false");
Student stu1 = new Student("张三", 11, "男");
Student stu2 = new Student("李四", 12, "男");
Student stu3 = new Student("王五", 13, "女");
Student stu4 = new Student("刘六", 12, "女");
Student stu5 = new Student("张三", 11, "男");
Student stu14 = new Student("张三", 11, "男");
Student stu6 = new Student("张三", 11, "男");
Student stu7 = new Student("张三", 11, "男");
Student stu8 = new Student("张三", 11, "男");
Student stu9 = new Student("张三", 12, "男");
Student stu10 = new Student("张三", 11, "男");
Student stu11 = new Student("张三", 11, "男");
Student stu12 = new Student("张三", 15, "男");
Student stu13 = new Student("张三", 11, "男");
List<Student> stuList = Arrays.asList(stu1, stu2, stu3, stu4, stu5, stu6, stu7, stu8, stu9, stu10, stu11,
stu12, stu13, stu14, stu5, stu1, stu2, stu3, stu4, stu1, stu2, stu3, stu4, stu5, stu6, stu7, stu8,
stu9, stu10, stu11, stu12, stu13, stu14, stu5, stu1, stu2, stu3, stu4, stu1, stu2, stu3, stu4, stu5,
stu6, stu7, stu8, stu9, stu10, stu11, stu12, stu13, stu14, stu5, stu1, stu2, stu3, stu4, stu1, stu2,
stu3, stu4, stu5, stu6, stu7, stu8, stu9, stu10, stu11, stu12, stu13, stu14, stu5, stu1, stu2, stu3,
stu4, stu1, stu2, stu3, stu4, stu5, stu6, stu7, stu8, stu9, stu10, stu11, stu12, stu13, stu14, stu5,
stu1, stu2, stu3, stu4);
Collections.sort(stuList, new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
return o1.getAge() > o2.getAge() ? 1 : (o1.getAge() == o2.getAge() ? 0 : -1);
}
});
for (Student student : stuList) {
System.out.println(student);
}
List<Integer> list = Arrays.asList(2, 1, 1, 3, 2);
Collections.sort(list, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1 > o2 ? 1 : -1;
}
});
}
}
急求解答!附赠阿里云免费套餐邀请码一个,能开云服务器数据库,很着急谢谢各位了。
이 문제는 JDK의 개별 버전으로 인해 발생합니다.
으아악다음을 시도해 볼 수 있습니다.
1>
System.setProperty("java.util.Arrays.useLegacyMergeSort", "true" );
2>
public int 비교(정수 o1, 정수 o2) {
}
JDK7 이상에서는 Comparator가 반사성, 이행성, 대칭성을 만족해야 합니다. 따라서 소스 코드에 해당 부분을 추가해야 합니다:
Collections.sort(list, new Comparator<Integer>() {
으아악다음으로 변경됨:
Collections.sort(list, new Comparator<Integer>() {
으아악JDK 1.7과 1.8을 오류 없이 실행했습니다.
으아악이 두 위치에 문제가 있습니다. JDK는 o1.getAge()와 o2.getAge()의 동일성을 확인할 수 없습니다.
해야 합니다.그리고 코드는 이렇게 작성하지 않고 직접
return o1.getAge()-o2.getAge()
return o1-o2