Java 6 和 Java 8 中排序代码的不同输出

问题描述

我编写了以下代码用于对我的数据进行排序。 此代码输出在 Java 6 和 Java 8 中是不同的。此外,比较对象的顺序是相反的,我认为这会导致最终输出发生变化。 排序算法可能不正确,但仍然有人可以解释为什么会这样吗?

请检查 Java 6 和 Java 8 中附加的代码输出

代码

package assignements;

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

class ComparableObject {
    private String id;
    private String name;
    private boolean hidden;
    private Integer order;


    ComparableObject() {
    }

    ComparableObject(String id,String name,boolean hidden,Integer columnorder) {
        this.id = id;
        this.name = name;
        this.hidden = hidden;
        this.order = columnorder;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public boolean isHidden() {
        return hidden;
    }

    public void setHidden(boolean hidden) {
        this.hidden = hidden;
    }

    public Integer getorder() {
        return order;
    }

    public void setorder(Integer order) {
        this.order = order;
    }
}

public class ComparatorPoc {

    public static void main(String[] args) {
        List<ComparableObject> list = new ArrayList<ComparableObject>();
        list.add(new ComparableObject("1547","id",false,10));
        list.add(new ComparableObject("1548","name",true,20));
        list.add(new ComparableObject("1592","customername",30));
        list.add(new ComparableObject("1549",40));
        list.add(new ComparableObject("1551","OrderTo",50));
        list.add(new ComparableObject("1553","PO",60));

        Collections.sort(list,new Comparator<ComparableObject>() {
            @Override
            public int compare(ComparableObject o1,ComparableObject o2) {
                System.out.println(o1.getName());
                System.out.println(o2.getName());
                System.out.println("****************");
                boolean o1Hidden = o1.isHidden();
                boolean o2Hidden = o2.isHidden();
                if (o1Hidden && o2Hidden)
                    return 0;
                else if (o1Hidden)
                    return 1;
                else
                    return -1;
            }
        });

        for (ComparableObject p : list) {
            System.out.println("Id=" + p.getId() + " Name=" + p.getName() + " Column Order=" + p.getorder() + " IsHidden=" + p.isHidden());
        }
    }
}

Java 6 输出

id
name
****************
name
customername
****************
id
customername
****************
name
customername
****************
customername
OrderTo
****************
name
OrderTo
****************
customername
OrderTo
****************
customername
PO
****************
Id=1547 Name=id Column Order=10 IsHidden=false
Id=1592 Name=customername Column Order=30 IsHidden=false
Id=1551 Name=OrderTo Column Order=50 IsHidden=false
Id=1548 Name=name Column Order=20 IsHidden=true
Id=1549 Name=customername Column Order=40 IsHidden=true
Id=1553 Name=PO Column Order=60 IsHidden=true

Java 8 输出

name
id
****************
customername
name
****************
customername
name
****************
customername
id
****************
customername
id
****************
customername
name
****************
OrderTo
name
****************
OrderTo
id
****************
OrderTo
customername
****************
PO
id
****************
PO
customername
****************
Id=1551 Name=OrderTo Column Order=50 IsHidden=false
Id=1592 Name=customername Column Order=30 IsHidden=false
Id=1547 Name=id Column Order=10 IsHidden=false
Id=1548 Name=name Column Order=20 IsHidden=true
Id=1549 Name=customername Column Order=40 IsHidden=true
Id=1553 Name=PO Column Order=60 IsHidden=true

解决方法

使用 Comparator 的方法给出的所有保证都假定 Comparator 正确实现了 the compare contract。但是有几种简单的方法可以巧妙地破坏它。

在您的具体情况下,您违反了 compare(a,b)compare(b,a) 的符号必须相反(除非它们都返回 0)的约定,当 hidden 为 {{ 1}} 用于 falsea

实现者必须确保所有 bsgn(compare(x,y)) == -sgn(compare(y,x))x

由于您违反了合同,因此不再指定 y 方法的确切行为。

Java 6 和 Java 8 之间使用的排序算法可能发生了变化,这意味着它们处理这种(未指定的)情况的方式不同。这不是 sort() 代码中的错误。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...