Java 6 和 Java 8 中排序代码的不同输出
Different output of sorting code in Java 6 and 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", false, 30));
list.add(new ComparableObject("1549", "customername", true, 40));
list.add(new ComparableObject("1551", "OrderTo", false, 50));
list.add(new ComparableObject("1553", "PO", true, 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
assume that the Comparator
correctly implements the compare
contract 的方法给出的所有保证。但是有几种简单的方法可以巧妙地破坏它。
在您的特定情况下,您违反了 compare(a, b)
和 compare(b, a)
的符号必须相反的约定(除非它们都 return 0
)当 hidden
对于 a
和 b
都是 false
:
The implementor must ensure that sgn(compare(x, y)) == -sgn(compare(y, x))
for all x
and y
.
由于您违约,sort()
方法的确切行为不再指定。
Java 6 和 Java 8 之间使用的排序算法可能发生了变化,这意味着它们处理这种(未指定)情况的方式不同。这不是 sort
代码中的错误。
我编写了以下代码来对我的数据进行排序。 此代码的输出在 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", false, 30));
list.add(new ComparableObject("1549", "customername", true, 40));
list.add(new ComparableObject("1551", "OrderTo", false, 50));
list.add(new ComparableObject("1553", "PO", true, 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
assume that the Comparator
correctly implements the compare
contract 的方法给出的所有保证。但是有几种简单的方法可以巧妙地破坏它。
在您的特定情况下,您违反了 compare(a, b)
和 compare(b, a)
的符号必须相反的约定(除非它们都 return 0
)当 hidden
对于 a
和 b
都是 false
:
The implementor must ensure that
sgn(compare(x, y)) == -sgn(compare(y, x))
for allx
andy
.
由于您违约,sort()
方法的确切行为不再指定。
Java 6 和 Java 8 之间使用的排序算法可能发生了变化,这意味着它们处理这种(未指定)情况的方式不同。这不是 sort
代码中的错误。