首页 > 编程语言 >Java比较器

Java比较器

时间:2023-05-23 23:08:12浏览次数:37  
标签:Comparable Goods Java 对象 Object new 排序 比较

Java比较器

背景:

在Java中经常会涉及到对象数组的排序问题,那么就涉及到对象之间 的比较问题。Java实现对象排序的方式有两种:自然排序:java.lang.Comparable 定制排序:java.util.Comparator

方式一:自然排序:java.lang.Comparable

  • Comparable接口强行对实现它的每个类的对象进行整体排序。这种排序被称 为类的自然排序。
  • 实现 Comparable 的类必须实现 compareTo(Object obj) 方法,两个对象即 通过 compareTo(Object obj) 方法的返回值来比较大小。如果当前对象this大 于形参对象obj,则返回正整数,如果当前对象this小于形参对象obj,则返回 负整数,如果当前对象this等于形参对象obj,则返回零。
  • 实现Comparable接口的对象列表(和数组)可以通过 Collections.sort 或 Arrays.sort进行自动排序。实现此接口的对象可以用作有序映射中的键或有 序集合中的元素,无需指定比较器。
  • 对于类 C 的每一个 e1 和 e2 来说,当且仅当 e1.compareTo(e2) == 0 与 e1.equals(e2) 具有相同的 boolean 值时,类 C 的自然排序才叫做与 equals 一致。建议(虽然不是必需的)最好使自然排序与 equals 一致。

Comparable 的典型实现:(默认都是从小到大排列的)

String:按照字符串中字符的Unicode值进行比较

Character:按照字符的Unicode值来进行比较 数值类型对应的包装类以及BigInteger、BigDecimal:按照它们对应的数值 大小进行比较

Boolean:true 对应的包装类实例大于 false 对应的包装类实例

Date、Time等:后面的日期时间比前面的日期时间大

举例:

class Goods implements Comparable {
	private String name;
	private double price;
//按照价格,比较商品的大小
@Override
public int compareTo(Object o) {
	if(o instanceof Goods) {
	Goods other = (Goods) o;
	if (this.price > other.price) {
	return 1;
	} else if (this.price < other.price) {
	return -1;
	}
	return 0;
}
	throw new RuntimeException("输入的数据类型不一致");
}
//构造器、getter、setter、toString()方法略
}

方式二:定制排序:java.util.Comparator

  • 当元素的类型没有实现java.lang.Comparable接口而又不方便修改代码, 或者实现了java.lang.Comparable接口的排序规则不适合当前的操作,那 么可以考虑使用 Comparator 的对象来排序,强行对多个对象进行整体排 序的比较。
  • 重写compare(Object o1,Object o2)方法,比较o1和o2的大小:如果方法返 回正整数,则表示o1大于o2;如果返回0,表示相等;返回负整数,表示 o1小于o2。
  • 可以将 Comparator 传递给 sort 方法(如 Collections.sort 或 Arrays.sort), 从而允许在排序顺序上实现精确控制。
  • 还可以使用 Comparator 来控制某些数据结构(如有序 set或有序映射)的 顺序,或者为那些没有自然顺序的对象 collection 提供排序。

举例

Goods[] all = new Goods[4];
all[0] = new Goods("War and Peace", 100);
all[1] = new Goods("Childhood", 80);
all[2] = new Goods("Scarlet and Black", 140);
all[3] = new Goods("Notre Dame de Paris", 120);
Arrays.sort(all, new Comparator() {
@Override
	public int compare(Object o1, Object o2) {
	Goods g1 = (Goods) o1;
	Goods g2 = (Goods) o2;
	return g1.getName().compareTo(g2.getName());
	}
});
System.out.println(Arrays.toString(all));

标签:Comparable,Goods,Java,对象,Object,new,排序,比较
From: https://blog.51cto.com/u_15977171/6334585

相关文章

  • #yyds干货盘点#JavaScript的数学对象——Math对象
    Math对象●js给我们提供了一些操作数字的方法●也是一种数据类型是复杂数据类型●Math对象的通用语法:Math.xxx()random()●Math.random()这个方法是用来生成一个0~1之间的随机数●每次执行生成的数字都不一样,但是一定是0~1之间的●生成的数字包含0,但是不包含1var......
  • 这可能是最全面的Java面试八股文了
    Java的特点Java是一门面向对象的编程语言。面向对象和面向过程的区别参考下一个问题。Java具有平台独立性和移植性。Java有一句口号:Writeonce,runanywhere,一次编写、到处运行。这也是Java的魅力所在。而实现这种特性的正是Java虚拟机JVM。已编译的Java程序可以在任何带有JV......
  • 哈夫曼树的实现-Java实现
    哈夫曼的核心思想在于,wpl最小;1packagedataSrtuct.TreeAlgorithm;23importjava.util.ArrayList;4importjava.util.Collections;5importjava.util.List;67publicclassHuffmanTree{8publicstaticvoidmain(String[]args){9int[]......
  • 编写javaweb用到的基本依赖,mybatis-config.xml代码,SqlSessionFactoryUtils.java
    这篇文章仅仅作为记录,供以后复制粘贴使用pom.xml<dependencies><!--Servlet--><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</vers......
  • Java Object 划分
    Object划分1.PO(persistantobject)持久对象PO就是对应数据库中某个表中的一条记录,多个记录可以用PO的集合。PO中应该不包含任何对数据库的操作。2.DO(DomainObject)领域对象就是从现实世界中抽象出来的有形或无形的业务实体。3.TO(TransferObject),数据传输对象不......
  • Java设计模式-原型模式
    简介原型模式是一种创建型设计模式,它允许在运行时通过复制现有对象来创建新对象,而不是通过构造函数创建。这个模式的核心思想是基于一个现有的对象克隆一个新的对象,这个过程对外部世界是透明的,就像对象从未被克隆过一样。原型模式的一个关键优点是可以避免在创建对象时重复性地......
  • Java核心之多态
    多态解析:最早学一个变量------>内存空间(小容器) 只有一个后来学一个数组------>内存空间(小容器) 存储一组一样的数据类型 好处是在于堆内存中存储的地址连续 便于循环遍历 数组创建时必须指定长度  频繁的添加或删除元素 个数固定就很不方便再后来学习如何描述类---......
  • 记录--使用率比较低的10个Web API
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助avaScript中有些API可能使用率比较低,下面我们逐一介绍它们的用法和使用场景。至于标题,主要是想让你进来看看,兄弟们别打我!BlobAPIBlobAPI用于处理二进制数据,可以方便地将数据转换为Blob对象或从Blob对象读取数......
  • [Java]instanceof和getClass()的区别
    getClass()willbeusefulwhenyouwanttomakesureyourinstanceisNOTasubclassoftheclassyouarecomparingwith. classA{}classBextendsA{}Objecto1=newA();Objecto2=newB();o1instanceofA=>trueo1instanceofB=>false......
  • java api调用kafka
    已经启用了zookeeper和kafka单机的ip为192.168.80.128加入maven的pom.xml代码如下 <dependency><groupId>org.apache.kafka</groupId><artifactId>kafka-clients</artifactId><version>0.8.2.1</version&g......