Using collections.sort() with compareTo, not sorting

后端 未结 2 705
悲哀的现实
悲哀的现实 2021-01-22 18:22

So currently I\'m working on an assignment where I have to two classes, one is named Fysiker and the other Human. Fysiker is simply an extension of the Human class. Human has tw

2条回答
  •  温柔的废话
    2021-01-22 19:00

    In fact the method defined in the subclass :

    public int compareTo(Fysiker o){
    

    doesn't override the method in the base class :

    public int compareTo(Human o){
    

    You could define the subclass with the same signature to override effectively :

    public int compareTo(Human o){
    

    and using instanceof to make the comparison according to the real type.
    But it would be not a good idea either. Indeed, Fysiker would know how to compare Human and Fysiker but Human would know how to compare only Humans.

    The Comparable.compareTo() contract states that :

    The implementor must also ensure that the relation is transitive: ((compare(x, y)>0) && (compare(y, z)>0)) implies compare(x, z)>0.

    Comparable should not try to be interoperable between classes as it may violate the transitivity comparison principle.

    I think that in your case, as alternative, you should use a Comparator to sort elements.

    You have two ways.

    1) If the list contains only Fysiker instances, declare a List of Fysiker and create a Comparator :

    List fysiker = new ArrayList();
    ...
    Collections.sort(fysiker);
    

    It limits the type of the elements that the List may accept but it is wished in this specific case.

    2) If the list contains both Human and Fysiker instances, declare a List of Human and create a Comparator :

    List humans = new ArrayList();
    ...
    Collections.sort(fysiker);
    

    In the Comparator implementation, you should check the type of the instances and compare them according to :

    public class ComparatorHumanAndFysiker implements Comparator{
    
          public int compare(Human o1, Human o2){
    
               if (o1 instanceof Fysiker && o2 instanceof Fysiker){
                  Fysiker f1 = (Fysiker) o1;
                  Fysiker f2 = (Fysiker) o2;
                  // specific comparison
                  return ...;
               }
    
                // else mixed type comparison or human comparison              
                return o1.age - o2.age;                         
            }
     } 
    

提交回复
热议问题