b2c信息网

您现在的位置是:首页 > 热点事件 > 正文

热点事件

comparable源码分析(tapable 源码)

hacker2022-07-05 06:44:34热点事件101
本文目录一览:1、Java的Comparable接口重写comparaTo方法问题2、

本文目录一览:

Java的Comparable接口重写comparaTo方法问题

看你排序的时候怎么调用这方法了compareTo。

假设一个类Test实现了compareTo接口,然后对一个ListTest list进行排序,然后我们用java.util.Collections.sort(list)这方法排序,那现在就去看看Collections.sort这方法的源码,我们可以看到最终实现排序的地方在Collections.sort(list)--Arrays.sort(a)--mergeSort(aux, a, 0, a.length, 0)的这段代码里:

for (int i=low; ihigh; i++)

for (int j=i; jlow

((Comparable) dest[j-1]).compareTo(dest[j])0; j--)

swap(dest, j, j-1);

return;

现在就能看到是((Comparable) dest[j-1]).compareTo(dest[j])0这一句调用了compareTo方法(就是我们刚才实现的那个接口),这句代码的意思就是假设前一个对象Test与后一个Test相比,如果compareTo返回的结果大于0,那么就swap(交换),然后再回到你这问题“为什么return this.age-s.age; 就是按升序排序,反过来就是降序排序”,this.age-s.age如果大于0,那么就swap交换,那就是比较大的age就被交换到后面去了,所以就是升序了。“反过来就是降序排序”。。懂了吧。

为什么object可以转换为comparable,以下是java中比较object数组的源码,第一句实现实在不懂,满意给高分

不是object可以转换为comparable,而是要实现两个object的比较必须实现comparable接口,重写compareTo方法,都实现接口,当然就可以转换为comparable了,泛型还有专门的讲解

java中Comparable和Comparator两种比较器的区别

Comparable和Comparator接口都是为了对类进行比较,众所周知,诸如Integer,double等基本数据类型,java可以对他们进行比较,而对于类的比较,需要人工定义比较用到的字段比较逻辑。可以把Comparable理解为内部比较器,而Comparator是外部比较器,基本的写法如下:

class Apple implements ComparableApple{

int id;

double price;

public Apple(int id, double price) {

this.id = id;

this.price = price;

}

public int compareTo(Apple o) {

//return Double.compare(this.getPrice(),o.getPrice());

if (Math.abs(this.price-o.price)0.001)

return 0;

else

return (o.price-this.price)0?1:-1;

}

@Override

public String toString() {

return "Apple{" +

"id=" + id +

", price=" + price +

'}';

}

}

class AESComparator implements ComparatorApple{

public int compare(Apple o1, Apple o2) {

if (Math.abs(o1.price-o2.price)0.001)

return 0;

else{

return (o1.price-o2.price)0?1:-1;

}

}

}

实现了Comparable接口的类需要实现compareTo()方法,传入一个外部参数进行比对,实现了Comparator接口的方法需要实现compare()方法,对外部传入的两个类进行比较,从而让外部方法在比较时调用。

两者的区别是实现Comparator接口代码更加灵活,可以定义某个类的多个比较器,从而在排序时根据实际场景自由调用,而Comparable接口实现后便不能改动。两种接口的调用方式如下:

class AESComparator implements ComparatorApple{

public int compare(Apple o1, Apple o2) {

if (Math.abs(o1.price-o2.price)0.001)

return 0;

else{

return (o1.price-o2.price)0?1:-1;

}

}

}

class DESComparator implements ComparatorApple{

public int compare(Apple o1, Apple o2) {

if (Math.abs(o1.price-o2.price)0.001)

return 0;

else {

return (o1.price-o2.price)0?-1:1;

}

}

}

public static void main(String[] args) {

Apple apple1 = new Apple(1,4.8);

Apple apple2 = new Apple(2,5.9);

Apple apple3 = new Apple(3,8.5);

ListApple list = new ArrayListApple();

list.add(apple1);

list.add(apple3);

list.add(apple2);

System.out.println("Comparable==========");

System.out.printf("this list of apples: %s\n",list);

Collections.sort(list);

System.out.printf("this list of apples: %s\n",list);

System.out.println("Comparator==========");

System.out.printf("this list of apples: %s\n",list);

Collections.sort(list,new DESComparator());

System.out.printf("this list of apples: %s\n",list);

Collections.sort(list,new AESComparator());

System.out.printf("this list of apples: %s\n",list);

}

}

上述代码存在的问题,不能在比较器中进行double类型的减法操作,因为对于值比较大的double,减法操作容易导致值的溢出,java7对每一种包装类型的比较新增了compare()方法,改造后的代码如下:

class Apple implements ComparableApple{

int id;

double price;

public Apple(int id, double price) {

this.id = id;

this.price = price;

}

public int compareTo(Apple o) {

return Double.compare(this.price,o.price);

}

@Override

public String toString() {

return "Apple{" +

"id=" + id +

", price=" + price +

'}';

}

}

class AESComparator implements ComparatorApple{

public int compare(Apple o1, Apple o2) {

return Double.compare(o1.price,o2.price);

}

}

class DESComparator implements ComparatorApple{

public int compare(Apple o1, Apple o2) {

return Double.compare(o2.price,o1.price);

}

}

查看Double.compare的源码如下

public static int compare(double d1, double d2) {

if (d1 d2)

return -1; // Neither val is NaN, thisVal is smaller

if (d1 d2)

return 1; // Neither val is NaN, thisVal is larger

// Cannot use doubleToRawLongBits because of possibility of NaNs.

long thisBits = Double.doubleToLongBits(d1);

long anotherBits = Double.doubleToLongBits(d2);

return (thisBits == anotherBits ? 0 : // Values are equal

(thisBits anotherBits ? -1 : // (-0.0, 0.0) or (!NaN, NaN)

1)); // (0.0, -0.0) or (NaN, !NaN)

}

JAVAcomparable如下Fileld实现comparable接口重写comparTo方法在测试类中究竟是如何调用这方法

请查看Collections.sort();方法的源码 该方法中filed的compareTo被调用。

Collections.sort()中调用了 Arrays.sort();

Arrays.sort(); 中调用了 mergeSort();方法

mergeSort 方法中有(Comparable) dest[j-1]).compareTo(dest[j])调用

Java 关于Comparable接口

这个你要结合TreeSet的特性和接口编程去理解。

首先,TreeSet是一种有序的Set。

在数据结构中,它利用了“红黑树”这种二叉树变种结构。(请参考)

当你通过allSet.add添加一个元素的时候。相当于在这颗二叉树中插入一个元素。

插入元素的位置由元素本身的自然顺序或(自定义比较器、实现Comparable接口的方法)决定。

相当于,调用add方法时,TreeSet会沿着树的根节点一直“向下找”,向下找的过程就会用到你自定义实现的compareTo方法。通过该方法,TreeSet才能知道,元素是可以插入到当前位置了,还是是沿着左孩子(如果compareTo 0)或者右孩子(如果compareTo 0)方向往下找。当然,插入只是一个过程,插入完成后还会涉及到左旋,右旋,来使树平衡。这就是数据结构和算法方面的问题了。

发表评论

评论列表

  • 萌懂疚爱(2022-07-05 17:39:39)回复取消回复

    \n",list);}}上述代码存在的问题,不能在比较器中进行double类型的减法操作,因为对于值比较大的double,减法操作容易导致值的溢出,java7对每一种包装类型的比较新增了compare()方法,改造后的代码如

  • 瑰颈好倦(2022-07-05 16:55:40)回复取消回复

    es are equal(thisBits anotherBits ? -1 : // (-0.0, 0.0) or (!NaN, NaN)1)); //

  • 掩吻逐鹿(2022-07-05 10:11:23)回复取消回复

    树平衡。这就是数据结构和算法方面的问题了。