简体   繁体   English

可比接口

[英]Comparable Interface

Why is it beneficial to implement the Comparable interface instead of just defining my own compareTo() method? 为什么实现Comparable接口而不是仅定义自己的compareTo()方法有什么好处?

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? 另一件事, java.util.Arrays.sort(Object[] o)方法与Comparable接口有什么关系,以便我能够实现Comparable接口以能够使用Arrays.sort(Object[] o)方法?

Why is it beneficial to implement the Comparable interface instead of just defining my own compareTo method? 为什么实现Comparable接口而不是仅定义自己的compareTo方法会有好处?

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. Java api中有可比性用于此目的,并且所有人都非常了解。 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? 另一件事,java.util.Arrays.sort(Object [] o)方法与Comparable接口有什么关系,以便我能够实现Comparable接口以能够使用Arrays.sort(Object [] o)方法?

Arrays.sort() method internally calls the compareTo() method of Comparable classes to sort the content. Arrays.sort()方法在内部调用Comparable类的compareTo()方法对内容进行排序。

Check the source code of Arrays.sort() , the delegating method use the Comparabble#compareTo() method 检查Arrays.sort()的源代码,委托方法使用Comparabble#compareTo()方法

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. 如果要通过Collections.sort()方法对类的实例进行排序,则需要实现此接口。 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. 例如,您可以使用sort()方法轻松地对String的实例进行排序,这是因为String实现了Comparable接口,并且该接口具有单个方法compareTo(),每次我们对String Instances进行排序时都会调用该方法。 Similarly you can use it your own way for sorting Instances of your class by implementing Comparable and overriding its method CompareTo(). 同样,您可以通过实现Comparable并覆盖其方法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 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM