首页 > 其他分享 >Comparable和Comparator的区别

Comparable和Comparator的区别

时间:2023-02-20 18:44:58浏览次数:59  
标签:Comparable name Comparator 区别 list weight height public

一、概述

Comparable和Comparator都是用来实现比较的,一般用于集合中元素的比较
基本包装类型,Integer、Long以及String都实现了Comparable接口,该接口的排序逻辑必须写在比较对象中,所以又叫自然排序
我们一般集合排序使用的Collections.sort(),默认使用的就是Comparable

 public static <T extends Comparable<? super T>> void sort(List<T> list) {
     list.sort(null);
 }

当然,我们也可以指定比较器,这里使用的就是Comparator了

 public static <T> void sort(List<T> list, Comparator<? super T> c) {
     list.sort(c);
 }

二、实际使用

1、Comparable

定义了对象Forlan,实现了Comparable接口,重写了compareTo(对象)方法

public class Forlan implements Comparable<Forlan> {

	private String name;

	/**
	 * 身高
	 */
	private int height;

	/**
	 * 体重
	 */
	private int weight;

	public Forlan(String name, int height, int weight) {
		this.name = name;
		this.height = height;
		this.weight = weight;
	}

	@Override
	public String toString() {
		return "Forlan{" +
				"name='" + name + '\'' +
				", height=" + height +
				", weight=" + weight +
				'}';
	}

	/**
	 * 比较身高
	 */
	@Override
	public int compareTo(Forlan forlan) {
		return this.height - forlan.height;
	}
}

验证比较器

List<Forlan> list = new ArrayList<>();
Forlan forlan1 = new Forlan("身高低,体重中", 170, 130);
Forlan forlan2 = new Forlan("身高高,体重低", 180, 120);
Forlan forlan3 = new Forlan("身高中,体重高", 175, 140);
list.add(forlan1);
list.add(forlan2);
list.add(forlan3);
Collections.sort(list);
System.out.println(list);

// 运行结果
[Forlan{name='身高低,体重中', height=170, weight=130}, Forlan{name='身高中,体重高', height=175, weight=140}, Forlan{name='身高高,体重低', height=180, weight=120}]

2、Comparator

定义了对象ForlanW,实现了Comparator接口,重写了compare(T o1, T o2)方法

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

public class ForlanW implements Comparator<ForlanW>{

	private String name;

	/**
	 * 身高
	 */
	private int height;

	/**
	 * 体重
	 */
	private int weight;

	public ForlanW(String name, int height, int weight) {
		this.name = name;
		this.height = height;
		this.weight = weight;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getHeight() {
		return height;
	}

	public void setHeight(int height) {
		this.height = height;
	}

	public int getWeight() {
		return weight;
	}

	public void setWeight(int weight) {
		this.weight = weight;
	}

	@Override
	public String toString() {
		return "ForlanComparator{" +
				"name='" + name + '\'' +
				", height=" + height +
				", weight=" + weight +
				'}';
	}

	@Override
	public int compare(ForlanW o1, ForlanW o2) {
		return o1.height - o2.height;
	}

	public static void main(String[] args) {
		List<ForlanW> list = new ArrayList<>();
		ForlanW forlan1 = new ForlanW("身高低,体重中", 170, 130);
		ForlanW forlan2 = new ForlanW("身高高,体重低", 180, 120);
		ForlanW forlan3 = new ForlanW("身高中,体重高", 175, 140);
		list.add(forlan1);
		list.add(forlan2);
		list.add(forlan3);
		// Collections.sort(list, new HeightComparator()); // 身高比较
		// Collections.sort(list, new WeightComparator()); // 体重比较
		// 身高比较
		Collections.sort(list, (ForlanW o1, ForlanW o2) -> {
			return o1.height - o2.height;
		});
		System.out.println(list);
	}
}

class HeightComparator implements Comparator<ForlanW> {
	@Override
	public int compare(ForlanW o1, ForlanW o2) {
		return o2.getHeight() - o1.getHeight();
	}
}

class WeightComparator implements Comparator<ForlanW> {
	@Override
	public int compare(ForlanW o1, ForlanW o2) {
		return o2.getWeight() - o1.getWeight();
	}
}

验证比较器

List<ForlanComparator> list = new ArrayList<>();
ForlanComparator forlan1 = new ForlanComparator("身高低,体重中", 170, 130);
ForlanComparator forlan2 = new ForlanComparator("身高高,体重低", 180, 120);
ForlanComparator forlan3 = new ForlanComparator("身高中,体重高", 175, 140);
list.add(forlan1);
list.add(forlan2);
list.add(forlan3);
// Collections.sort(list, new HeightComparator()); // 身高比较
// Collections.sort(list, new WeightComparator()); // 体重比较
// 身高比较
Collections.sort(list,(ForlanComparator o1, ForlanComparator o2)->{
	return o1.height - o2.height;
});
System.out.println(list);

// 运行结果
[ForlanComparator{name='身高低,体重中', height=170, weight=130}, ForlanComparator{name='身高中,体重高', height=175, weight=140}, ForlanComparator{name='身高高,体重低', height=180, weight=120}]

三、总结

1、相同点

Comparable和Comparator都是用于比较排序

2、不同点

  • 接口所在包不同:java.lang.Comparable、java.util.Comparator
  • 比较逻辑不同:Comparable的在类中,Comparator可以在类中,也可以在类外,但在类中意义不大(简单来说,Comparable是内部比较器,Comparator是外部比较器)
  • 排序方法不同:Comparable重写方法compareTo(T o),Comparator重写方法compare(T o1, T o2)
  • 在Collections.sort()中使用不同:一个参数,默认是Comparable自然排序,二个参数,需要传入Comparator外部排序
  • 排序规则数量限制不同:Comparable唯一,Comparator可以有多个

标签:Comparable,name,Comparator,区别,list,weight,height,public
From: https://www.cnblogs.com/huozhonghun/p/17138491.html

相关文章

  • Memcached与Redis有什么区别
    Redis和Memcached都是基于内存的数据存储系统。Memcached是高性能分布式内存缓存服务,其本质上就是一个内存key-value数据库。Redis是一个开源的key-value存储系统。与......
  • mobx store 创建区别
    mobx6之前的版本创建store的时候,如果有observable属性,那么store自动变成observable的mobx6之后的版本需要自己在构造函数调用makeObservable函数并传入store本身,从而把......
  • 进程与线程的区别
    1.根本区别:进程是操作系统进行资源分配的最小单元,线程是操作系统进行运算调度的最小单元。2.从属关系不同:进程中包含了线程,线程属于进程。3.开销不同:进程的创建、销毁和......
  • 【转】golang的log.Fatal()和panic()函数的区别
    golang的log.Fatal()和panic()函数的区别在讲两者区别之前我们先看一下os.Exit()函数的定义:funcExit(codeint)Exitcausesthecurrentprogramtoexitwiththe......
  • MySQL中length()、char_length()的区别和用法
    方法概述:char_length(str)计算单位:字符不管汉字还是数字或者是字母都算是一个字符length(str)计算单位:字节utf8编码:一个汉字三个字节,一个数字或字母一个字节。gbk......
  • Centos运行.net core程序的多种方式以及相互之间的区别。
     nohupdotnet/www/wwwroot/xxx.dll--urls"http://*:6001;http://*:6002"&此时候的6001和6002端口对应的程序的内存和static变量都是存在同一个堆栈里面,可以做缓存。......
  • nohup java -jar启动jar包,war包以及nohup和&的区别
    nohupjava-jara.jar>a.log2>&1&上面的命令意识: 1. nohup:不挂断地运行命令。nohangup的缩写,意即“不挂断”,注意没有后台运行功能,如果你直接在shell中用CtrlC,......
  • TreeSet的使用以及Comparator接口
    packageedu.wtbu;importjava.util.Comparator;importjava.util.Iterator;importjava.util.TreeSet;publicclassDemo01{publicstaticvoidmain(String[]args......
  • 微信小程序全局变量(globalData)和缓存(StorageSync)的区别和用法
    globalData和storage的区别一、app.globalData是全局变量,下次进入的时候,就要重新获取,一般用于:1、保存一些可能涉及安全类的数据,例如资源类,每次需要很准确的,就建议用全......
  • Linux文件 profile、bashrc、bash_profile区别
    Linux系统中,有三种文件出现的非常频繁,那就是profile、bash_profile、bashrc文件。1、profile作用profile,路径:/etc/profile,用于设置系统级的环境变量和启动程序,在......