「java比较器的调用」java类之间的调用
本篇文章给大家谈谈java比较器的调用,以及java类之间的调用对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
- 1、Java比较器,求java大神
- 2、java里的Collections类中的静态方法sort()是怎么用比较器比较两个对象?
- 3、Java语言 比较器Comparator
- 4、java中Comparable和Comparator两种比较器的区别
Java比较器,求java大神
name是String类的。
String类也有实现Comparable接口,也重写了public int compareTo(Object o)函数
他的比较方式是字符串的比较,这个你应该知道的。
java里的Collections类中的静态方法sort()是怎么用比较器比较两个对象?
1、定义一个实现Comparator接口的类如:LightComparator,然后实现public int compare(Object o1,Object o2)方法。这个方法的实现将决定你是以何种方式排序。例如:你根据价格排序,那么这个方法实现为:
public int compare(Object o1,Object o2){
Light l1 = (Light)o1;
Light l2 = (Light)o2;
return (int)(l1.getPrice()-l2.getPrice());
}//假定你这个类里有get set方法。
2、运用Collections排序,提供一个List(保存的是Light对象)设为list:
Collections.sort(list,new LightComparator());
Java语言 比较器Comparator
O1.isAssignableFrom(O2)方法,如果调用这个方法的O1 与O2表示的类或接口相同,或者是O2的父类,则返回true。
那么 比较的结果就是 ABC,compare()返回为负数表示小于,正数表示大于,0表示等于
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)
}
java比较器的调用的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java类之间的调用、java比较器的调用的信息别忘了在本站进行查找喔。