Java Comparable接口

原文:https://www.studytonight.com/java/comparable-in-collection-framework.php

Java Comparable 接口是集合框架的一个成员,用于比较对象,并按照自然顺序进行排序。

自然排序是指compareTo()方法的行为,定义在Comparable接口中。它的排序技术取决于接口使用的对象类型。如果对象类型是字符串,则按字典顺序对其进行排序。

如果对象类型是包装类对象,如:整数或列表,那么它会根据它们的值进行排序。

如果对象类型是自定义对象,如:用户定义的对象,则根据定义的compareTo()方法进行排序。

实现这个接口的类可以通过调用Collections.sort()方法自动排序。实现此接口的对象可以用作排序映射中的键或排序集合中的元素,而无需指定 comaprator。这个接口的声明如下。

申报

public interface Comparable<T>

可比方法

它包含下面给出的单一方法compareTo()

int compareTo(T o) : 它将对象与指定的对象进行比较,以便排序。

compareTo()功能将当前对象与提供的对象进行比较。这个函数已经为默认包装类和基本数据类型实现了,但是这个函数也需要为用户定义的类实现。

如果当前对象大于提供的对象,则返回正整数。

如果当前对象小于提供的对象,则返回负整数。

如果当前对象等于提供的对象,则它返回零。

例外

如果指定的对象为空,则该方法返回 NullPointerException,如果指定对象的类型阻止将其与该对象进行比较,则返回ClassCastException

示例:排序列表

让我们举一个例子来对存储整数值的ArrayList进行排序。我们使用集合类的sort()方法对实现比较接口的对象进行排序。因为整数包装类实现了可比较,所以我们能够得到排序的对象。见下面的例子。

  import java.util.*;  
public class Demo {  
    public static void main(String a[]){
      // Creating List
        ArrayList<Integer> list = new ArrayList<>();
        // Adding elements
        list.add(100);  
        list.add(2);  
        list.add(66); 
        list.add(22);
        list.add(10);
        // Displaying list
        System.out.println(list);
        // Sorting list
        Collections.sort(list);
        // Displaying sorted list
        System.out.println("Sorted List : "+list);
    }  
}

[100,2,66,22,10]排序列表:[2,10,22,66,100]

示例:排序字符串对象

对字符串对象进行排序时,可比较的基于字典顺序对其进行排序。意思是像排序顺序这样的字典。见下面的例子。

  import java.util.*;  
public class Demo {  
    public static void main(String a[]){
      // Creating List
        ArrayList<String> list = new ArrayList<>();
        // Adding elements
        list.add("D");  
        list.add("L");  
        list.add("A"); 
        list.add("Z");
        list.add("C");
        // Displaying list
        System.out.println(list);
        // Sorting list
        Collections.sort(list);
        // Displaying sorted list
        System.out.println("Sorted List : "+list);
    }

[D,L,A,Z,C]排序列表:[A,C,D,L,Z]

示例:排序用户定义的对象

如果我们有自定义对象,那么我们必须实现 Comparable 接口并覆盖其 compareTo()方法。现在它将基于我们在compareTo()方法中定义的逻辑进行比较。见下面的例子。

  import java.util.*;  

class Employee implements Comparable <Employee>
{
    int empId;
    String name;
    public Employee (int empId, String name)
    {
        this.empId=empId;
        this.name=name;
    }
    public String toString()
    {
        return this.empId + " " + this.name;
    }

     // Sorting by empId
    public int compareTo(Employee std){    

        return this.empId - std.empId; 
    } 
}

public class Demo {  
    public static void main(String a[]){
      ArrayList <Employee> list = new ArrayList <Employee> ( ); 
        list.add(new Employee(2, "Boman")); 
        list.add(new Employee(1, "Abram")); 
        list.add(new Employee(3, "Dinesh")); 

        // Displaying
        for (int i=0; i<list.size(); i++) 
            System.out.println(list.get(i)); 

        // Sorting 
        Collections.sort(list); 

        // Displaying after sorting
        System.out.println("\nAfter Sorting :\n");
        for (int i=0; i<list.size(); i++) 
            System.out.println(list.get(i)); 
    }  
}

2 博曼 1 亚伯兰 3 迪内什排序后:1 亚伯兰 2 博曼 3 迪内什