为了账号安全,请及时绑定邮箱和手机立即绑定

JDK7抛出异常:Comparison method violates its ……(急求解决,附赠答案奖励)

JDK7抛出异常:Comparison method violates its ……(急求解决,附赠答案奖励)

慕神8447489 2019-02-22 07:48:32
最近在学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; } }); } } 急求解答!附赠阿里云免费套餐邀请码一个,能开云服务器数据库,很着急谢谢各位了。
查看完整描述

3 回答

?
凤凰求蛊

TA贡献1825条经验 获得超4个赞

这个应该是JDK 个别版本引起的
你可以尝试下:
1>
System.setProperty("java.util.Arrays.useLegacyMergeSort", "true");
2>
public int compare(Integer o1, Integer o2) {

return o1.compareTo(o2);

}

查看完整回答
反对 回复 2019-03-01
?
MMMHUHU

TA贡献1834条经验 获得超8个赞

在JDK7版本以上,Comparator要满足自反性,传递性,对称性。所以你需将源代码中的部分:

Collections.sort(list, new Comparator<Integer>() {

        @Override
        public int compare(Integer o1, Integer o2) {
            return o1 > o2 ? 1 : -1;
        }

改成:

Collections.sort(list, new Comparator<Integer>() {

        @Override
        public int compare(Integer o1, Integer o2) {
            return o1 > o2 ? 1 : (o1 == o2 ? 0 : -1);
        }
查看完整回答
反对 回复 2019-03-01
?
LEATH

TA贡献1936条经验 获得超6个赞

我用JDK1.7,1.8都运行过,没有报错;

 public int compare(Student o1, Student o2) {
                return o1.getAge() > o2.getAge() ? 1 : (o1.getAge() == o2.getAge() ? 0 : -1);
            }

public int compare(Integer o1, Integer o2) {
                return o1 > o2 ? 1 : -1;
            }

这两个地方是有问题的,JDK无法判断o1.getAge(),o2.getAge()相等的情况。
而且代码也不是这么写,应该是直接
return o1.getAge()-o2.getAge()
return o1-o2

查看完整回答
反对 回复 2019-03-01
  • 3 回答
  • 0 关注
  • 644 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信