我有以下java集合代码。
主要的主题是根据他们的ID对“Employee”对象进行排序,
但是我通过编写“Collections.sort()”方法遇到了一个问题。
当“jvm”执行“Collections.sort(al)”时,
java 1.6在compareTo()方法中将结果显示为50和60,即它调用e1.compareTo(e2)。
而在java 1.7中,compareTo()方法中的结果为60和50,即它调用
e2.compareTo(E1)。
无论是e1还是e2,实际上“这个”都有效。
什么是实际问题。是“Jvm”在中打电话给“e2.compareTo(e1)”
在java1.7和java1.6中的“e1.compareTo(e2)”?
class Employee implements Comparable<Employee>
{
int eid;String name;
Employee(String name,int eid){
this.name=name;
this.eid=eid;
}
public int compareTo(Employee e)
{
int eid1=this.eid;
int eid2=e.eid;
System.out.println(eid1);
System.out.println(eid2);
System.out.println("-------------");
if(eid1<eid2)
return -1;
if(eid1>eid2)
return +1;
else
return 0;
}}
public class ForEmployee {
public static void main(String[] args)
{
Employee e1=new Employee("raja",50);
Employee e2=new Employee("rani",60);
ArrayList<Employee> al=new ArrayList<Employee>();
boolean a=al.add(e1);
boolean b=al.add(e2);
Collections.sort(al);
}}
答案 0 :(得分:3)
最终结果排序结果无论如何都是一样的,因此在排序算法中进行比较的顺序对你来说无关紧要。
内部排序实现在java 6和7之间发生了变化,因此这就是为什么你看到以不同顺序调用的方法。您不应该依赖排序中的任何序列,因此如果您遇到此问题,则应在代码中修复该依赖关系。
答案 1 :(得分:1)
由于我在本地安装了java 1.6和1.7,因此我在两个版本中测试了您的代码,并且可以确认结果。和你一样,这让我好奇,我做了一些谷歌搜索。我找到了这个有趣的博客:
http://dertompson.com/2012/11/23/sort-algorithm-changes-in-java-7/
他主要讨论了如果创建compareTo方法而获得的异常,这些方法取决于它们被调用的顺序。但他也提到从1.6到1.7,默认搜索算法从合并排序更改为时间排序。
我将假设添加了异常,因为新算法使compareTo方法独立于调用它们的方式变得很重要。毕竟逻辑错误比异常更糟糕。您的方法应该适用于所有情况。