2014-02-20 2 views
1

У меня есть следующий код java-коллекции.Метод CompareTo() дает разные результаты в версиях java differnt

Основная тема заключается в том, что сортировка объектов «Сотрудник» на основе их идентификаторов, , но у меня есть одна проблема здесь, написав метод «Collections.sort()». Когда «jvm» выполняет «Collections.sort (al)»,
java 1.6 дает результат как 50 и 60 в методе compareTo(), т.е. вызывает e1.compareTo (e2).
тогда как в java 1.7 дает результат как 60 и 50 в методе compareTo(), то есть он вызывает e2.compareTo (e1).
Что на самом деле «это» означает, что e1 или e2. В чем проблема. Является ли «Jvm» вызовом «e2.compareTo (e1)» в
в java1.7 и «e1.compareTo (e2)» в java1.6?

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); 
    }} 
+1

Почему это проблема? Инкапсуляция здесь, чтобы вы не беспокоились о том, как сортировка действительно выполняется. –

+0

Алгоритм сортировки может быть реализован по-разному (это на самом деле!) На разных версиях Java. Но это не имеет значения, нет гарантии, в каком порядке этот метод называется. – qqilihq

+0

@dystroy: Если я знаю, действительно ли он вызывает e2.compareTo (e1) или e1.compareTo (e2), то только я могу записать оставшийся код. – reddy

ответ

3

Конечный результат, результат сортировки, в любом случае одинаковый, поэтому порядок сравнений, выполненный в алгоритме сортировки, не имеет для вас значения.

Внутренняя реализация сортировки изменилась между java 6 и 7, поэтому вы видите методы, вызываемые в другой последовательности. В любом случае вы не должны полагаться на какую-либо последовательность в сортировке, поэтому, если у вас есть проблемы с этим, вы должны исправить эту зависимость в своем коде.

1

Как я и установил локальную версию java 1.6 и 1.7, я протестировал ваш код в обеих версиях и смог подтвердить результаты. Как с тобой, мне стало любопытно, и я сделал несколько поисковых запросов. Я нашел этот интересный блог:

http://dertompson.com/2012/11/23/sort-algorithm-changes-in-java-7/

Он в основном говорит о за исключением вы получите, если вы создаете методы CompareTo, которые зависят в каком порядке они называются. Но он также упомянул, что с 1.6 до 1.7 алгоритм поиска по умолчанию изменяется от сортировки слияния до сортировки по типу.

Я предполагаю, что исключение добавлено, поскольку новый алгоритм делает важным, чтобы методы compareTo работали независимо от того, каким образом они вызываются. Ведь логическая ошибка хуже исключения. Ваш метод должен работать во всех случаях.

Смежные вопросы