[Java基础]-- java Comparator和Comparable使用

本文详细介绍了Java中Comparable与Comparator两种排序方式的区别与应用。通过具体示例展示了如何使用这两种方式对对象集合进行排序,并对比了它们的特点及适用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、背景

1、常见的面试问题之一是“比较器和比较器之间有什么区别”。或者“如何通过其id或名称对员工对象的收集进行排序”。

为此,我们可以使用两个接口。比较器和可比较。在我们实际看到差异之前,让我简单介绍一下。

2、如果任何类实现可比较的内容,那么该对象的集合可以使用Collection.sort()或Arrays.sort()自动排序。

对象将根据该类中的compareTo方法进行排序。
在Java中实现Comparable的对象可以像TreeMap或SortedSet一样用作TreeSet中的键,而不需要实现任何其他接口。

 

二、区别

Paramter

              Comparable

Comparator

排序逻辑

排序逻辑必须在对象正在排序的同一个类中。

因此,这被称为对象的自然排序

排序逻辑是分开的类。

因此,我们可以根据要排序的对象的不同属性编写不同的排序。

例如使用id,名称等进行排序

实现

要排序的对象的类必须实现此接口。

Product类需要通过uuid实现与

Product对象的集合相当的类

要对其进行排序的对象不需要实现此接口的类。

其他类可以实现此接口。

Eg-UserComparator
类可以实现Comparator接口,

按照id来对User/id对象进行排序

排序方法

int compareTo(Object o1)
此方法将此对象与o1对象进行比较,并返回一个整数。

它的值具有以下含义
1.正 - 此对象大于o2 
2.零 - 此对象等于o1 
3.负 - 此对象为小于o1

int compare(Object o1,Object o2)
此方法比较o1和o2对象。并返回一个整数。

它的值具有以下含义。
1.正 - o1大于o2 
2.零 - o1等于o2 
3.负 - o1小于o1

调用方法

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/

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

oo寻梦in记

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值