<五>java数据结构与算法 对象排序

本文深入探讨了Java中实现对象排序的两种主要方式:通过实现Comparable接口进行类的自然排序,以及使用Comparator接口进行外部排序。详细解释了Comparable接口的compareTo方法的实现原则和Comparator接口的使用方法,包括自定义排序规则的例子。
摘要由CSDN通过智能技术生成

实现对象排序有2种方式:

   1.实现接口java.lang.Interface Comparable<T>:

参数:T - 可以与此对象进行比较的那些对象的类型;
此接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的compareTo 方法被称为它的自然比较方法。必须要实现compareTo(T o)方法
Comparable 是在集合内部定义的方法实现的排序,Comparator(下面会说) 是在集合外部实现的排序,所以,如想实现排序,就需要在集合外定义 Comparator 接口的方法或在集合内实现 Comparable 接口的方法。
注意:
对于类C 的每一个e1e2 来说,当且仅当 e1.compareTo(e2) == 0e1.equals(e2) 具有相同的 boolean 值时,类C 的自然排序才叫做与 equals 一致。注意,null 不是任何类的实例,即使e.equals(null) 返回falsee.compareTo(null) 也将抛出 NullPointerException
int compareTo(T obj):
比较此对象与指定对象的顺序。如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。
(拓展:符号sgn(expression) 指定 signum 数学函数,该函数根据 expression 的值是负数、零还是正数,分别返回-101 中的一个值。 )

实现类必须确保对于所有的xy 都存在sgn(x.compareTo(y)) == -sgn(y.compareTo(x)) 的关系。(这意味着如果y.compareTo(x) 抛出一个异常,则x.compareTo(y) 也要抛出一个异常。)

实现类还必须确保关系是可传递的:(x.compareTo(y)>0 && y.compareTo(z)>0) 意味着x.compareTo(z)>0

最后返回:整数、零或正整数,根据此对象是小于、等于还是大于指定对象。


//实现Comparable接口要覆盖compareTo方法, 在compareTo方法里面实现比较:
public class Animal implements Comparable {
String name;
int age
public int compareTo(Animal another) {
int i = 0;
i = name.compareTo(another.name); // 使用字符串的比较
if(i == 0) { // 如果名字一样,比较年龄, 返回比较年龄结果
return age - another.age;
} else {
return i; // 名字不一样, 返回比较名字的结果.
}
}
}
// 排序的时候就可以直接用 Collections.sort( List<Animal> ) 对其排序了.
 
 
 
 
 
 
 
 
2.实现接口java.util.Comparator<T>

类型参数:T - 此 Comparator 可以比较的对象类型

  Comparator 是在集合外部实现的排序; Comparator 是一个专用的比较器,当这个对象不支持自比较,或者自比较函数不能满足你的要求时,你可以写一个比较器来完成两个对象之间前后大小的比较。可以按照自己自定义的规则来比较;

<span style="font-size:18px;"><span style="font-size:18px;"><strong>class AnimalComparator implements Comparator { 
     public int compare(Animal one, Animal another) {
          int i = 0;
          i = one.name.compareTo(another.name); // 使用字符串的比较
          if(i == 0) { // 如果名字一样,比较年龄,返回比较年龄结果
               return one.age - another.age;
          } else {
               return i; // 名字不一样, 返回比较名字的结果.
          }
     }
}
   使用的时候:Collections.sort( personList , new AnimalComparator()) 可以对其排序</strong></span></span>

自定义自己的排序规则:

<span style="font-size:18px;"><strong><span style="font-size:18px;">public   class   AbsComparator   implements   Comparator   {     
    public   int   compare(Object   o1,   Object   o2)   {     
      int   v1   =   Math.abs(((Integer)o1).intValue());     
      int   v2   =   Math.abs(((Integer)o2).intValue());     
      return   v1   >   v2   ?   1   :   (v1   ==   v2   ?   0   :   -1);     
    }     
}</span></strong></span>


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值