سؤال

Why is it beneficial to implement the Comparable interface instead of just defining my own compareTo() method?

Another thing, how does the java.util.Arrays.sort(Object[] o) method relate to the Comparable interface such that I HAVE to implement the Comparable interface to be able to use the Arrays.sort(Object[] o) method?

هل كانت مفيدة؟

المحلول

Why is it beneficial to implement the Comparable interface instead of just defining my own compareTo method?

You can define your own method, but all the classes, which need to compare must know it. Comparable is there in Java api for this purpose and all peoples know it well. Comparable interface is a super type for many classes, regardless of their origin. So, it's commonly used in all major frameworks.

Another thing, how does the java.util.Arrays.sort(Object[] o) method relate to the Comparable interface such that I HAVE to implement the Comparable interface to be able to use the Arrays.sort(Object[] o) method?

Arrays.sort() method internally calls the compareTo() method of Comparable classes to sort the content.

Check the source code of Arrays.sort(), the delegating method use the Comparabble#compareTo() method

private static void mergeSort(Object[] src,
                  Object[] dest,
                  int low,
                  int high,
                  int off) {
    int length = high - low;

    // Insertion sort on smallest arrays
        if (length < INSERTIONSORT_THRESHOLD) {
            for (int i=low; i<high; i++)
                for (int j=i; j>low &&
             ((Comparable) dest[j-1]).compareTo(dest[j])>0; j--)
                    swap(dest, j, j-1);
            return;
        }

        // Recursively sort halves of dest into src
        int destLow  = low;
        int destHigh = high;
        low  += off;
        high += off;
        int mid = (low + high) >>> 1;
        mergeSort(dest, src, low, mid, -off);
        mergeSort(dest, src, mid, high, -off);

        // If list is already sorted, just copy from src to dest.  This is an
        // optimization that results in faster sorts for nearly ordered lists.
        if (((Comparable)src[mid-1]).compareTo(src[mid]) <= 0) {
            System.arraycopy(src, low, dest, destLow, length);
            return;
        }

        // Merge sorted halves (now in src) into dest
        for(int i = destLow, p = low, q = mid; i < destHigh; i++) {
            if (q >= high || p < mid && ((Comparable)src[p]).compareTo(src[q])<=0)
                dest[i] = src[p++];
            else
                dest[i] = src[q++];
        }
    }

نصائح أخرى

The Comparable Interface lets you sort lists and arrays of objects. If you want to sort instances of your class through Collections.sort() method you need to Implement this Interface. For example you can easily sort instances of String using the sort() method that is because String Implements Comparable Interface and the Interface has a single method compareTo() which is invoked each time we are sorting String Instances. Similarly you can use it your own way for sorting Instances of your class by implementing Comparable and overriding its method CompareTo().

// below is the example to override the CompareTo() method
import java.io.*;
import java.util.*;
public class DVDInfo implements Comparable<DVDInfo>{
    String title;
    String genre;
    String LeadActor;
    List<DVDInfo> dvdList=new ArrayList<DVDInfo>();

    public DVDInfo(String t, String g,String a) {
        title=t;
        genre=g;
        LeadActor=a;
    }
    public String toString()
    {
        return("Title: "+ title +" Genere: " +genre + " LeadActor: " +LeadActor );
    }
    public String getTitle()
    {
        return title;
    }
    public String getGenre()
    {
        return genre;
    }
    public String getLeadActor()
    {
        return LeadActor;
    }

    public void addList(DVDInfo d)
    {
        dvdList.add(d);

    }
    @SuppressWarnings("unchecked")
    public void populateList()
    {
            Collections.sort(dvdList);
            System.out.println(dvdList);

    }
    @Override
    public int compareTo(DVDInfo d) {
        // TODO Auto-generated method stub
        return title.compareTo(d.getTitle());
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub

        DVDInfo d=new DVDInfo("Conjuring","Horror","Patrik Wilson");
        DVDInfo e=new DVDInfo("Insidious", "Horror", "Patrik Wilson");

        d.addList(d);
                d.addList(e);
                d.populateList();

    }

    }


    enter code here
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top