
正文
java中代码的比较器 java中的比较函数
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
java中Comparable和Comparator两种比较器的区别
Comparable和Comparator接口都是为java中代码的比较器了对类进行比较,众所周知,诸如Integer,double等基本数据类型,java可以对java中代码的比较器他们进行比较,而对于类的比较,需要人工定义比较用到的字段比较逻辑。可以把Comparable理解为内部比较器,而Comparator是外部比较器,基本的写法如下java中代码的比较器:
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)
}
相关问答
Q1: java中能不能只有比较器而对象没事实现comparable呢?
当然可以,可以直接创建一个比较器类(甚至不用创建,直接用匿名类)
示例代码如下:
//AbsComparator.java
import java.util.*;
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);
}
}
//Test.java
import java.util.*;
public class Test {
public static void main(String[] args) {
//产生一个20个随机整数的数组(有正有负)
Random rnd = new Random();
Integer[] integers = new Integer[20];
for(int i = 0; i integers.length; i++)
integers[i] = new Integer(rnd.nextInt(100) * (rnd.nextBoolean() ? 1 : -1));
System.out.println("用Integer内置方法排序:");
Arrays.sort(integers);
System.out.println(Arrays.asList(integers));
System.out.println("用AbsComparator排序:");
Arrays.sort(integers, new AbsComparator());
System.out.println(Arrays.asList(integers));
}
}
Q2: java 中compare 是什么?
method some method in java.util.Comparator,答案要求是java.util.comparator
equals 是java.lang.string的
compareTo是是java.lang.Comparable的
compare(Object o1,Object o2)方法是java.util.ComparatorT接口的方法
所以选E
Q3: java里的Collections类中的静态方法sort()是怎么用比较器比较两个对象?
compareto的确是返回一个(-1,0,1)的值。
pricecomparator
类的compare方法调用compareto,他的返回值也是(-1,0,1)中的一个。
collections.sort方法就是按照pricecomparator
类的compare方法来比较list的各个元素,进行排序。
collections.sort的源码我没有看过,不知道他具体使用什么方法排序,不过排序算法就那么几类:选择排序、插入排序、交换排序。估计是快速排序吧。
Q4: java类里有compute()方法如何自动比较的
jdk1.6
比较器接口:Comparable
要排序的Object实现比较器接口
如果你的代码中使用Arrays.sort进行排序,看jdk源代码以下几个方法,最终会去调用接口方法(java.lang.Comparable#compareTo)实现排序。
--java.util.Arrays#sort(java.lang.Object[])
--java.util.Arrays#mergeSort(java.lang.Object[], java.lang.Object[], int, int, int)
Q5: java Collections排序问题
你这问题问的有点不太对,o2.length()-o1.length()是字符串长度降序排序,o1.length()-o2.length()是字符串长度的升序排序的。
首选你要明白Collections.sort方法是按照从小到大递增来排序的
假设o2比o1长,
1、o2.length()-o1.length()值就是大于0,注意方法第一个形参为o1,第二个形参为o2,此时方法返回值大于0,代表了o1要比o2大,所以o1会排在o2的后面,即降序排列
2、o1.length()-o2.length值小于0,此时返回结果小于0,标识o1比o2小,所以o1会排在o2前面,即升序排序。
关于java中代码的比较器和java中的比较函数的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。





