Why should a Java class implement comparable?

后端 未结 10 608
忘掉有多难
忘掉有多难 2020-11-22 13:14

Why is Java Comparable used? Why would someone implement Comparable in a class? What is a real life example where you need to implement comparable

相关标签:
10条回答
  • 2020-11-22 13:26

    Here is a real life sample. Note that String also implements Comparable.

    class Author implements Comparable<Author>{
        String firstName;
        String lastName;
    
        @Override
        public int compareTo(Author other){
            // compareTo should return < 0 if this is supposed to be
            // less than other, > 0 if this is supposed to be greater than 
            // other and 0 if they are supposed to be equal
            int last = this.lastName.compareTo(other.lastName);
            return last == 0 ? this.firstName.compareTo(other.firstName) : last;
        }
    }
    

    later..

    /**
     * List the authors. Sort them by name so it will look good.
     */
    public List<Author> listAuthors(){
        List<Author> authors = readAuthorsFromFileOrSomething();
        Collections.sort(authors);
        return authors;
    }
    
    /**
     * List unique authors. Sort them by name so it will look good.
     */
    public SortedSet<Author> listUniqueAuthors(){
        List<Author> authors = readAuthorsFromFileOrSomething();
        return new TreeSet<Author>(authors);
    }
    
    0 讨论(0)
  • 2020-11-22 13:26

    When you implement Comparable interface, you need to implement method compareTo(). You need it to compare objects, in order to use, for example, sorting method of ArrayList class. You need a way to compare your objects to be able to sort them. So you need a custom compareTo() method in your class so you can use it with the ArrayList sort method. The compareTo() method returns -1,0,1.

    I have just read an according chapter in Java Head 2.0, I'm still learning.

    0 讨论(0)
  • 2020-11-22 13:30

    The fact that a class implements Comparable means that you can take two objects from that class and compare them. Some classes, like certain collections (sort function in a collection) that keep objects in order rely on them being comparable (in order to sort you need to know which object is the "biggest" and so forth).

    0 讨论(0)
  • 2020-11-22 13:30

    For example when you want to have a sorted collection or map

    0 讨论(0)
  • 2020-11-22 13:34

    An easy way to implement multiple field comparisons is with Guava's ComparisonChain - then you can say

       public int compareTo(Foo that) {
         return ComparisonChain.start()
             .compare(lastName, that.lastName)
             .compare(firstName, that.firstName)
             .compare(zipCode, that.zipCode)
             .result();
       }
    

    instead of

      public int compareTo(Person other) {
        int cmp = lastName.compareTo(other.lastName);
        if (cmp != 0) {
          return cmp;
        }
        cmp = firstName.compareTo(other.firstName);
        if (cmp != 0) {
          return cmp;
        }
        return Integer.compare(zipCode, other.zipCode);
      }
    }
    
    0 讨论(0)
  • 2020-11-22 13:34

    Comparable is used to compare instances of your class. We can compare instances from many ways that is why we need to implement a method compareTo in order to know how (attributes) we want to compare instances.

    Dog class:

    package test;
    import java.util.Arrays;
    
    public class Main {
    
        public static void main(String[] args) {
            Dog d1 = new Dog("brutus");
            Dog d2 = new Dog("medor");
            Dog d3 = new Dog("ara");
            Dog[] dogs = new Dog[3];
            dogs[0] = d1;
            dogs[1] = d2;
            dogs[2] = d3;
    
            for (int i = 0; i < 3; i++) {
                System.out.println(dogs[i].getName());
            }
            /**
             * Output:
             * brutus
             * medor
             * ara
             */
    
            Arrays.sort(dogs, Dog.NameComparator);
            for (int i = 0; i < 3; i++) {
                System.out.println(dogs[i].getName());
            }
            /**
             * Output:
             * ara
             * medor
             * brutus
             */
    
        }
    }
    

    Main class:

    package test;
    
    import java.util.Arrays;
    
    public class Main {
    
        public static void main(String[] args) {
            Dog d1 = new Dog("brutus");
            Dog d2 = new Dog("medor");
            Dog d3 = new Dog("ara");
            Dog[] dogs = new Dog[3];
            dogs[0] = d1;
            dogs[1] = d2;
            dogs[2] = d3;
    
            for (int i = 0; i < 3; i++) {
                System.out.println(dogs[i].getName());
            }
            /**
             * Output:
             * brutus
             * medor
             * ara
             */
    
            Arrays.sort(dogs, Dog.NameComparator);
            for (int i = 0; i < 3; i++) {
                System.out.println(dogs[i].getName());
            }
            /**
             * Output:
             * ara
             * medor
             * brutus
             */
    
        }
    }
    

    Here is a good example how to use comparable in Java:

    http://www.onjava.com/pub/a/onjava/2003/03/12/java_comp.html?page=2

    0 讨论(0)
提交回复
热议问题