在实际应用中,咱们每每有须要比较两个自定义对象大小的地方。而这些自定义对象的比较,就不像简单的整型数据那么简单,它们每每包含有许多的属性,咱们通常都是根据这些属性对自定义对象进行比较的。因此Java中要比较对象的大小或者要对对象的集合进行排序,须要经过比较这些对象的某些属性的大小来肯定它们之间的大小关系。java
通常,Java中经过接口实现两个对象的比较,比较经常使用就是Comparable接口和Comparator接口。首先类要实现接口,而且使用泛型规定要进行比较的对象所属的类,而后类实现了接口后,还须要实现接口定义的比较方法(compareTo方法或者compare方法),在这些方法中传入须要比较大小的另外一个对象,经过选定的成员变量与之比较,若是大于则返回1,小于返回-1,相等返回0。算法
1、Comparable接口数组
1.什么是Comparable接口ide
此接口强行对实现它的每一个类的对象进行总体排序。此排序被称为该类的天然排序 ,类的 compareTo方法被称为它的天然比较方法 。实现此接口的对象列表(和数组)能够经过 Collections.sort(和 Arrays.sort )进行自动排序。实现此接口的对象能够用做有序映射表中的键或有序集合中的元素,无需指定比较器。 测试
2.实现什么方法ui
int compareTo(T o)this
比较此对象与指定对象的顺序。若是该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。
参数: o - 要比较的对象。 spa
返回:负整数、零或正整数,根据此对象是小于、等于仍是大于指定对象。设计
抛出:ClassCastException - 若是指定对象的类型不容许它与此对象进行比较。code
3.实例
package com.mxl.algorithlm; import java.util.Date; /** * 由于要实现对ConsumInfo对象的排序,因此在ConsunInfo类中要实现Comparable接口,也就是要实现compareTo()方法 * 具体的比较参照:依次按照price、uid进行倒序排序 * @author breeze * */ public class ConsumInfo implements Comparable<ConsumInfo> { private int uid; private String name; private double price; private Date datetime; public ConsumInfo() { // TODO Auto-generated constructor stub } public ConsumInfo(int uid,String name,double price,Date datetime){ this.uid = uid; this.name = name; this.price = price; this.datetime = datetime; } public int getUid() { return uid; } public void setUid(int uid) { this.uid = uid; } 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; } public Date getDatetime() { return datetime; } public void setDatetime(Date datetime) { this.datetime = datetime; } @Override public String toString() { return "ConsumInfo [uid=" + uid + ", name=" + name + ", price=" + price + ", datetime=" + datetime + "]"; } /** * 这里比较的是什么, Collections.sort方法实现的就是按照此比较的东西排列 * 顺序(从小到大): * if(price < o.price){ return -1; } if(price > o.price){ return 1; } * 倒序(从大到小): * if(price < o.price){ return 1; } if(price > o.price){ return -1; } * */ @Override public int compareTo(ConsumInfo o) { //首先比较price,若是price相同,则比较uid if(price < o.price){ return -1; } if(price > o.price){ return 1; } if(price == o.price){ if(uid < o.uid){ return -1; } if(uid > o.uid){ return 1; } } return 0; } } //测试类 package com.mxl.algorithlm; import java.util.ArrayList; import java.util.Collections; import java.util.Date; import java.util.List; public class ConsumInfoTest { public static void main(String[] args) { ConsumInfo consumInfo1 = new ConsumInfo(100, "consumInfo1", 400.0,new Date()); ConsumInfo consumInfo2 = new ConsumInfo(200, "consumInfo1", 200.0,new Date()); ConsumInfo consumInfo3 = new ConsumInfo(300, "consumInfo1", 100.0,new Date()); ConsumInfo consumInfo4 = new ConsumInfo(400, "consumInfo1", 700.0,new Date()); ConsumInfo consumInfo5 = new ConsumInfo(500, "consumInfo1", 800.0,new Date()); ConsumInfo consumInfo6 = new ConsumInfo(600, "consumInfo1", 300.0,new Date()); ConsumInfo consumInfo7 = new ConsumInfo(700, "consumInfo1", 900.0,new Date()); ConsumInfo consumInfo8 = new ConsumInfo(800, "consumInfo1", 400.0,new Date()); List<ConsumInfo> list = new ArrayList<ConsumInfo>(); list.add(consumInfo1); list.add(consumInfo2); list.add(consumInfo3); list.add(consumInfo4); list.add(consumInfo5); list.add(consumInfo6); list.add(consumInfo7); list.add(consumInfo8); System.out.println("排序前:"); //排序前 for(ConsumInfo consumInfo : list ){ System.out.println(consumInfo); } Collections.sort(list);//排序 System.out.println("排序后:"); //排序后 for(ConsumInfo consumInfo :list){ System.out.println(consumInfo); } } }
2、Comparator接口
与上面的Comparable接口不一样的是:
①、Comparator位于包java.util下,而Comparable位于包java.lang下。
②、Comparable接口将比较代码嵌入须要进行比较的类的自身代码中,而Comparator接口在一个独立的类中实现比较。
③、若是前期类的设计没有考虑到类的Compare问题而没有实现Comparable接口,后期能够经过Comparator接口来实现比较算法进行排序,而且为了使用不一样的排序标准作准备,好比:升序、降序。
④、Comparable接口强制进行天然排序,而Comparator接口不强制进行天然排序,能够指定排序顺序。
使用实例:
package test; import java.util.Comparator; /** * 具体的比较类(比较器),实现Comparator接口 * @author breeze * */ public class ComparatorConsunInfo implements Comparator<ConsumInfo> { /** * 顺序(从小到大): * if(price < o.price){ return -1; } if(price > o.price){ return 1; } * 倒序(从大到小): * if(price < o.price){ return 1; } if(price > o.price){ return -1; } */ @Override public int compare(ConsumInfo o1, ConsumInfo o2) { //首先比较price,若是price相同,则比较uid if(o1.getPrice() > o2.getPrice()){ return 1; } if(o1.getPrice() < o2.getPrice()){ return -1; } if(o1.getPrice() == o2.getPrice()){ if(o1.getUid() > o2.getUid()){ return 1; } if(o1.getUid() < o2.getUid()){ return -1; } } return 0; } } /** * 须要进行比较的类 * @author breeze * */ public class ConsumInfo{ private int uid; private String name; private double price; private Date datetime; public ConsumInfo() { // TODO Auto-generated constructor stub } public ConsumInfo(int uid,String name,double price,Date datetime){ this.uid = uid; this.name = name; this.price = price; this.datetime = datetime; } public int getUid() { return uid; } public void setUid(int uid) { this.uid = uid; } 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; } public Date getDatetime() { return datetime; } public void setDatetime(Date datetime) { this.datetime = datetime; } @Override public String toString() { return "ConsumInfo [uid=" + uid + ", name=" + name + ", price=" + price + ", datetime=" + datetime + "]"; } } //测试类 public class ConsumInfoTest { public static void main(String[] args) { ConsumInfo consumInfo1 = new ConsumInfo(100, "consumInfo1", 400.0,new Date()); ConsumInfo consumInfo2 = new ConsumInfo(200, "consumInfo1", 200.0,new Date()); ConsumInfo consumInfo3 = new ConsumInfo(300, "consumInfo1", 100.0,new Date()); ConsumInfo consumInfo4 = new ConsumInfo(400, "consumInfo1", 700.0,new Date()); ConsumInfo consumInfo5 = new ConsumInfo(500, "consumInfo1", 800.0,new Date()); ConsumInfo consumInfo6 = new ConsumInfo(600, "consumInfo1", 300.0,new Date()); ConsumInfo consumInfo7 = new ConsumInfo(700, "consumInfo1", 900.0,new Date()); ConsumInfo consumInfo8 = new ConsumInfo(800, "consumInfo1", 400.0,new Date()); List<ConsumInfo> list = new ArrayList<ConsumInfo>(); list.add(consumInfo1); list.add(consumInfo2); list.add(consumInfo3); list.add(consumInfo4); list.add(consumInfo5); list.add(consumInfo6); list.add(consumInfo7); list.add(consumInfo8); System.out.println("排序前:"); //排序前 for(ConsumInfo consumInfo : list ){ System.out.println(consumInfo); } ComparatorConsunInfo comparatorConsunInfo = new ComparatorConsunInfo();//比较器 Collections.sort(list,comparatorConsunInfo);//排序 System.out.println("排序后:"); //排序后 for(ConsumInfo consumInfo :list){ System.out.println(consumInfo); } } }