How To Sort Objects With Java Interface Comparable and Comparator

本文详细介绍了Java中对象排序的两种主要方法:通过实现Comparable接口和使用Comparator接口。对比了这两种方法的特点与适用场景,并通过具体示例展示了如何利用它们来对自定义类的对象进行排序。

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

Java 提供了Comparable 和Comparator 两个接口让程序员可以实现Java对象的排序。

首先总结下Comparable 与Comparator接口的区别:

java.lang.Comparable

java.util.Comparator

int objOne.compareTo(objTwo)

int compare (objOne, objTwo)

返回:

   负数:  如果 objOne < objTwo

   :      如果 objOne == objTwo

   正数:   如果  objOne > objTwo

 

 

Comparable

必须修改要比较的类的结构,令其实现Comparable 接口

编写一个独立的类,令其实现Comparator接口

一个类只能有一种排序

一个类可以有多重排序方式,只要多编写一个Comparator的实现类就好了。

JAVA API中经常用到,例如:String, 包装类(Integer, Long, Double…, Date, Calendar …

用于对第三方类的排序,因为第三方类一般都是无法修改的,更别说实现Comparable了,所以只能使用Comparator了。

 

Comparable 实现对象方式:

package com.citi.crc;

public class AudiCar implements Comparable<AudiCar> {
	
	private String series;
	private Double price;
	private Double speed;
	
	public String getSeries() {
		return series;
	}

	public void setSeries(String series) {
		this.series = series;
	}

	public Double getPrice() {
		return price;
	}

	public void setPrice(Double price) {
		this.price = price;
	}

	public Double getSpeed() {
		return speed;
	}

	public void setSpeed(Double speed) {
		this.speed = speed;
	}

	/* (non-Javadoc)
	 * @see java.lang.Comparable#compareTo(java.lang.Object)
	 */
	@Override
	public int compareTo(AudiCar o) {
		return this.getPrice().compareTo(o.getPrice());
	}
}

package com.citi.crc;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class TestAudiCar {

	public static void main(String[] args) {
		List<AudiCar> cars = new ArrayList<AudiCar>();
		
		AudiCar audiA3 = new AudiCar();
		audiA3.setSeries("A3");
		audiA3.setPrice(200000d);
		audiA3.setSpeed(80d);

		AudiCar audiA4 = new AudiCar();
		audiA4.setSeries("A4");
		audiA4.setPrice(260000d);
		audiA4.setSpeed(90d);
		
		AudiCar audiA6 = new AudiCar();
		audiA6.setSeries("A6");
		audiA6.setPrice(320000d);
		audiA6.setSpeed(100d);
		
		cars.add(audiA4);
		cars.add(audiA6);
		cars.add(audiA3);
		
		Collections.sort(cars);
//		Collections.reverse(cars);
		for (AudiCar car : cars) {
			System.out.println(car.getPrice());
		}
	}
}


 

Comparator 实现排序方式:

package com.citi.crc;

import java.util.Comparator;

public class AudiCar {
	
	private String series;
	private Double price;
	private Double speed;
	
	public String getSeries() {
		return series;
	}

	public void setSeries(String series) {
		this.series = series;
	}

	public Double getPrice() {
		return price;
	}

	public void setPrice(Double price) {
		this.price = price;
	}

	public Double getSpeed() {
		return speed;
	}

	public void setSpeed(Double speed) {
		this.speed = speed;
	}

	static class PriceComparator implements Comparator<AudiCar> {

		/* (non-Javadoc)
		 * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
		 */
		@Override
		public int compare(AudiCar o1, AudiCar o2) {
			return o1.getPrice().compareTo(o2.getPrice());
		}
		
	}

	static class SpeedComparator implements Comparator<AudiCar> {
		/* (non-Javadoc)
		 * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
		 */
		@Override
		public int compare(AudiCar o1, AudiCar o2) {
			return o1.getSpeed().compareTo(o2.getSpeed());
		}
	}
}

package com.citi.crc;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class TestAudiCar {

	public static void main(String[] args) {
		List<AudiCar> cars = new ArrayList<AudiCar>();
		
		AudiCar audiA3 = new AudiCar();
		audiA3.setSeries("A3");
		audiA3.setPrice(200000d);
		audiA3.setSpeed(80d);

		AudiCar audiA4 = new AudiCar();
		audiA4.setSeries("A4");
		audiA4.setPrice(260000d);
		audiA4.setSpeed(90d);
		
		AudiCar audiA6 = new AudiCar();
		audiA6.setSeries("A6");
		audiA6.setPrice(320000d);
		audiA6.setSpeed(100d);
		
		cars.add(audiA4);
		cars.add(audiA6);
		cars.add(audiA3);
		
		Collections.sort(cars, new AudiCar.PriceComparator());
//		Collections.sort(cars, new AudiCar.SpeedComparator());

		for (AudiCar car : cars) {
			System.out.println(car.getPrice());
		}
	}
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值