一、背景
1、常见的面试问题之一是“比较器和比较器之间有什么区别”。或者“如何通过其id或名称对员工对象的收集进行排序”。
为此,我们可以使用两个接口。比较器和可比较。在我们实际看到差异之前,让我简单介绍一下。
2、如果任何类实现可比较的内容,那么该对象的集合可以使用Collection.sort()或Arrays.sort()自动排序。
对象将根据该类中的compareTo方法进行排序。
在Java中实现Comparable的对象可以像TreeMap或SortedSet一样用作TreeSet中的键,而不需要实现任何其他接口。
二、区别
Paramter |
Comparable |
Comparator |
排序逻辑 |
排序逻辑必须在对象正在排序的同一个类中。 因此,这被称为对象的自然排序 |
排序逻辑是分开的类。 因此,我们可以根据要排序的对象的不同属性编写不同的排序。 例如使用id,名称等进行排序 |
实现 |
要排序的对象的类必须实现此接口。 Product类需要通过uuid实现与 Product对象的集合相当的类 |
要对其进行排序的对象不需要实现此接口的类。 其他类可以实现此接口。 Eg-UserComparator 按照id来对User/id对象进行排序 |
int compareTo(Object o1) 它的值具有以下含义 |
int compare(Object o1,Object o2) 它的值具有以下含义。 | |
调用方法 |
Collections.sort(List)这里的对象 将按照CompareTo方法进行排序 |
Collections.sort(List,Comparator) 这里的对象将根据比较方法在Comparator中进行排序 |
包 |
java.lang.Comparable |
java.util.Comparator |
三、使用
1、使用实现Comparable接口对Product的UUID进行降序排序
创建java类Product.java:
package com.ngaa.java.test.common;
/**
* Created by root on 20170819.
* Update date:
* Time: 16:36
* Project: sparkmvn
* Package: com.ngaa.java.test.common
* Describe :implement sort by uuid desc.
*
* Result of Test: test ok * Command: *
*
*/
public class Product implements Comparable{
private Long uuid;
private String name;
private Double price;
public Product(){}
public Product(Long uuid, String name, Double price) {
this.uuid = uuid;
this.name = name;
this.price = price;
}
public Long getUuid() {
return uuid;
}
public void setUuid(Long uuid) {
this.uuid = uuid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Double getPrice() {
return price;
}
public void setPrice(Double price) {
this.price = price;
}
@Override public String toString() {
return "Product{" + "uuid=" + uuid + ", name='" + name + '\'' + ", price=" + price + '}';
}
@Override public int compareTo(Product o) {
/** *默认是升序排序,需要重新该方法 */
//源码信息中有说明:-1代表a小于b,0代表a等于b,1代表a大于b
return (this.uuid>o.uuid)?-1:(this.uuid==o.uuid?0:1);
}
}
2、使用实现Comparator接口对User的id进行降序排序
(1)创建User.java
public class User implements Serializable {
private Long id;
private String name;
private Integer age;
public User() {
}
public User(Long id, String name, Integer age) {
this.id = id;
this.name = name;
this.age = age;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "User{" + "id=" + id + ", name='" + name + '\'' + ", age=" + age + '}';
}
}
(2)创建自定义比比较器UserComparator.java
public class UserComparator implements Comparator {
@Override
public int compare(User o1, User o2) {
Long s_id = o1.getId();
Long e_id = o2.getId();
return (s_id > e_id ? -1 : (s_id == e_id ? 0 : 1)); //默认是升序排序,所以需要重写
}
}
3、创建测试类TestCollectionSort.java
package com.ngaa.java.test.sort;
import com.ngaa.java.test.common.Product;
import com.ngaa.java.test.common.User;
import com.ngaa.java.test.common.UserComparator;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* Created by root on 20170819.
* Update date:
* Time: 16:46
* Project: sparkmvn
* Package: com.ngaa.java.test.sort
* Describe :test collection sort .
*/
public class TestCollectionSort {
public static void main(String[] args) {
TestCollectionSort testCollectionSort = new TestCollectionSort();
System.out.println("-------------------------Comparable接口排序结果------------------------------");
testCollectionSort.sortByUuid();
System.out.println("-------------------------Comparator接口排序结果------------------------------");
testCollectionSort.sortById();
}
/**
* 一、使用实现Comparable接口来倒序排序
*/
public void sortByUuid() {
//1、创建List集合(产品)
List productList=new ArrayList(){
{
add(new Product(1008l,"Car",66.0));
add(new Product(1001l,"Shooese",6.0));
add(new Product(1002l,"Phone",666.0));
add(new Product(1009l,"Computer",66.0));
add(new Product(1003l,"Apple",6.0));
add(new Product(1003l,"Bike",66.0));
}
};
System.out.println(Long.compare(1l,2l));
// 2、倒序排序
Collections.sort(productList);
// 3、遍历结果
for(Product product:productList){
System.out.println(product);
}
}
/** * 二、自定义比较器实现倒序排序 */
public void sortById(){
//1、创建List集合(用户)
List userList=new ArrayList(){
{
add(new User(2003l,"Tom",18));
add(new User(2004l,"Cassie",21));
add(new User(2002l,"Jim",16));
add(new User(2002l,"Sam",16));
add(new User(2008l,"Jams",19));
add(new User(2007l,"Jack",26));
add(new User(2009l,"Tom",18)); } };
//2、使用比较器
Collections.sort(userList, new UserComparator());
//3、遍历结果
for(User user:userList){
System.out.println(user);
}
}
}
4、排序结果
参考
1、http://docs.oracle.com/javase/6/docs/api/java/util/Comparator.html
2、https://stackoverflow.com/questions/6176019/comparing-long-values-using-collections-sortobject
3、http://www.java2blog.com/2013/02/difference-between-comparator-and-comparable-in-java.html
4、http://www.geeksforgeeks.org/comparable-vs-comparator-in-java/