Java Comparable接口示例

Java Comparable接口示例

原文: https://howtodoinjava.com/java/collections/java-comparable-interface/

Java Comparable接口,用于根据对象的自然顺序对对象的数组列表进行排序。 元素的自然排序是通过在对象中实现compareTo()方法来实现的。

1. Java Comparable接口

public interface Comparable<T> 
{
	public int compareTo(T o);
}

Java Comparable接口对实现它的每个类的对象强加了总体排序。 此排序称为类的自然排序,而该类的compareTo()方法也称为其自然比较方法。

使用Comparable接口,我们可以对以下元素进行排序:

  1. 字符串对象
  2. 包装器类对象,例如IntegerLong
  3. 用户定义的自定义对象

1.1 compareTo()方法

对于任何支持自然排序的类,它都应实现Comparable接口并覆盖其compareTo()方法。 它必须返回负整数,零或正整数,因为此对象小于,等于或大于指定的对象。

请注意,如果y.compareTo(x)引发异常,则方法必须引发异常。 关系也必须是可传递,即(x.compareTo(y) > 0 && y.compareTo(z) > 0)表示x.compareTo(z)> 0

例如,对于Employee类,自然排序可以基于其员工id

import java.time.LocalDate;

public class Employee implements Comparable<Employee> {

    private Long id;
    private String name;
    private LocalDate dob;

    @Override
    public int compareTo(Employee o) 
    {
        return this.getId().compareTo( o.getId() );
    }
}

所有包装器类和String类都实现Comparable接口。 包装器类通过它们的值进行比较,字符串在字典上进行比较。

1.2 Collections.sort()Arrays.sort()

  1. 使用Collections.sort()方法对对象的列表进行排序。
  2. 使用Arrays.sort()方法对对象的数组进行排序。

1.3 Collections.reverseOrder()

此工具方法返回一个Comparator,它在实现Comparable接口的对象集合上强加自然顺序的逆序。

这为排序(或维护)以反自然顺序实现Comparable接口的对象的集合(或数组)提供了一个简单的习惯用法。

2. Java Comparable示例

所有给定的示例都使用Collections.sort()方法对列表进行排序。 如果我们需要对相同对象的数组进行排序,只需将 Collections.sort()替换为Arrays.sort()

2.1 排序字符串列表

Java 程序使用Comparable接口对字符串列表进行排序。

ArrayList<String> list = new ArrayList<>();

list.add("E");
list.add("A");
list.add("C");
list.add("B");
list.add("D");

Collections.sort(list);

System.out.println(list);

程序输出。

[A, B, C, D, E]

2.2 以相反的顺序对字符串列表进行排序

Java 程序使用Comparable接口对字符串列表进行排序。

ArrayList<String> list = new ArrayList<>();

list.add("E");
list.add("A");
list.add("C");
list.add("B");
list.add("D");

//Sort in reverse natural order
Collections.sort(list, Collections.reverseOrder());

System.out.println(list);

程序输出:

[E, D, C, B, A]

2.3 排序整数列表

Java 程序使用Comparable接口对整数列表进行排序。

ArrayList<Integer> list = new ArrayList<>();

list.add(10);
list.add(300);
list.add(45);
list.add(2);
list.add(5);

//Natural order
Collections.sort(list);

System.out.println(list);

//Sort in reverse natural order
Collections.sort(list, Collections.reverseOrder());

System.out.println(list);

程序输出:

[2, 5, 10, 45, 300]
[300, 45, 10, 5, 2]

2.4 排序员工名单

Java 程序使用Comparable接口对自定义对象列表进行排序。 在此示例中,我们将按 ID 排序员工列表。

ArrayList<Employee> list = new ArrayList<>();

list.add(new Employee(22l, "Lokesh", LocalDate.now()));
list.add(new Employee(18l, "Alex", LocalDate.now()));
list.add(new Employee(30l, "Bob", LocalDate.now()));
list.add(new Employee(600l, "Charles", LocalDate.now()));
list.add(new Employee(5l, "David", LocalDate.now()));

//Natural order
Collections.sort(list);

System.out.println(list);

//Sort in reverse natural order
Collections.sort(list, Collections.reverseOrder());

System.out.println(list);

程序输出:

[
	Employee [id=5, name=David, dob=2018-10-29], 
	Employee [id=18, name=Alex, dob=2018-10-29], 
	Employee [id=22, name=Lokesh, dob=2018-10-29], 
	Employee [id=30, name=Bob, dob=2018-10-29], 
	Employee [id=600, name=Charles, dob=2018-10-29]
]

//Reverse sorted

[
	Employee [id=600, name=Charles, dob=2018-10-30], 
	Employee [id=30, name=Bob, dob=2018-10-30], 
	Employee [id=22, name=Lokesh, dob=2018-10-30], 
	Employee [id=18, name=Alex, dob=2018-10-30], 
	Employee [id=5, name=David, dob=2018-10-30]
]

3. 总结

在本教程中,我们学习了 Java 集合框架的Comparable接口。 它有助于通过简单的接口实现对对象施加自然顺序。

我们学习了对字符串列表,字符串数组,整数列表,整数数组进行排序,并学习了如何使用可比性对 Java 中的员工对象进行排序。

将我的问题放在评论部分。

学习愉快!

参考文献:

Comparable接口 Java 文档