java-排序接口Comparable

Comparable接口

使实现类自身具备某种比较规则以便对其对象进行自然排序的接口

自然排序:是要求自定义类实现comparable接口并重写其compareTo(T o)方法,在此方法中依据xx属性进行排序的算法。

  • public interface Comparable<T>

    该接口对实现它的每个类的对象强加一个整体排序。这个排序被称为类的自然排序 ,类的compareTo方法被称为其自然比较方法 。

    实现此接口的对象的列表(和数组)可以自动排序Collections.sort (和Arrays.sort )。实现该接口的对象,可以使用如在键sorted map或作为在元件sorted set ,而不需要指定一个comparator 。

    一类的自然排序C被说成是与equals一致 ,当且仅当e1.compareTo(e2) == 0具有相同的布尔值e1.equals(e2) ,每e1e2C 。注意, null不是任何类的实例,而e.compareTo(null)应该抛出一个NullPointerException即使e.equals(null)返回false 。

    强烈建议(尽管不需要)自然排序与等于一致。这是因为,当没有显式比较器的排序集(和排序映射)与其自然排序与equals不一致的元素(或键)一起使用时会“奇怪地”。特别地,这种排序集合(或排序映射)违反了用于设定(或映射)的通用合同,其按照equals方法定义。

    例如,如果加上两个键ab使得(!a.equals(b) && a.compareTo(b) == 0)到有序集合不使用显式的比较器,所述第二add (有序集合不增加的大小和)操作返回false因为ab是等价从排序集的角度。

    实际上,实现Comparable所有Java核心类都具有与等于一致的自然排序。一个例外是java.math.BigDecimal ,其自然排序等于BigDecimal具有相等值和不同精度(例如4.0和4.00)的对象。

    对于数学倾斜,定义给定类C的自然排序的关系是:

     {(x, y) such that x.compareTo(y) <= 0}. 

    这个总订单的是:

     {(x, y) such that x.compareTo(y) == 0}. 

    它从合同紧跟compareTo ,该商数是一个等价关系 C ,那自然排序是一个总的顺序 C 。当我们说一个类的自然排序与equals一致时 ,我们意味着自然排序的商是由类的equals(Object)方法定义的等价关系:

      {(x, y) such that x.equals(y)}.

 

Conparator 比较器

在外部自定义比较规则以便容器对其储存数据进行定制排序的对象;

定制排序:要求自定义类实现comparator接口并重写其compare(T o1,T o2)方法,在此方法中依据xx属性进行排序的算法,也成为比较器排序;

Comparable 接口 实现该接口的类具有排序功能,需要重写comparareTo方法,使用当前对象和参数对象进行比较

Comparator接口,不会对集合中储存的元素进行修饰;需要自定义比较器类实现改接口,重写compare方法,比较连个参数对象;需要将比较器对象以参数的形式传入集合的构造器中。

原创文章,作者:guozi,如若转载,请注明出处:https://www.sudun.com/ask/78867.html

(0)
guozi的头像guozi
上一篇 2024年5月30日
下一篇 2024年5月30日

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注