java中通过接口实现两个对象的比较,常用的就是Comparable和Comparator接口。
Comparable:位于java.lang包
Comparator:位于java.util包
排序通常使用的方法是:
Collections.sort(List<T> list)
或者
Collections.sort(List<T> list, Comparator<? super T> c)
根据排序的方法可以看到,一种是对象本身实现了排序,一种是实现Comparator接口的排序。具体使用如下所示:
一、Comparable:
Comparable接口将比较代码嵌入需要进行比较的类的自身代码中。此接口强行对实现它的每个类的对象进行整体排序。此排序被称为该类的自然排序,类的CompareTo方法被称为它的自然比较方法。实现此接口的对象列表可以通过Collections.sort(和Arrays.sort)进行自动排序。实现此接口的对象可以用作有序映射表中的键或有序集合中的元素,无需指定比较器。
示例:
/**
* 因为要实现对ConsumInfo对象的排序,所以ConsumInfo类中要实现Comparable接口
* 也就是要实现compareTo()方法
*/
public class ConsumInfo implements Comparable<ConsumInfo> {
private int uid;
private String name;
private double price;
private Date datetime;
public ConsumInfo() {
}
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 int compareTo(ConsumInfo o) {
//升序排序
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;
}
}
测试类:
public class ConsumIofoTest {
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);
}
}
}
二、Comparator:
Comparator接口在一个独立的类中实现。如果前期类的设计没有考虑到类的Compare问题而没有实现Comparable接口,后期可以通过Comparator接口实现比较算法进行排序。
示例:
//要进行比较的类
public class ConsumInfo{
private int uid;
private String name;
private double price;
private Date datetime;
public ConsumInfo() {
}
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 +
'}';
}
}
//实现Comparator接口的比较器
public class ComparatorConsunInfo implements Comparator<ConsumInfo> {
public int compare(ConsumInfo o1, ConsumInfo o2) {
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;
}
}
//测试类
public class ConsumIofoTest {
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);
}
}
}
今天想对一个集合进行排序,看了自己写的文章,竟然没看懂。因为说到排序,自然有升序和降序。但是上述篇幅都没有说到。。。。。
现在补充一下:
对于Comparable方式来说:
public int compareTo(BeanClass bc) {
//return this.para - bc.para; //升序
return bc.para-this.para; //降序
}
对于Comparator:方式来说
@Override
public int compare(BeanClass o1, BeanClass o2) {
//return o1.para-o2.para; //升序
return o2.para-o1.para; //降序
}