挽救的比较器:Comparator

/* * 挽救的比较器:Comparator * Comparable接口的主要特征是在类定义的时候就默认实现好的接口 * *
由于初期的设计并没有安排此类对象数组的排序,又突然需要实现对象数组的排序, *
那么这个时候不能修改book的情况下不能修改Comparable 只能使用 java。util。Comparator * *
在Comparator有两个方法 * int compare(T o1,
T o2) 比较其两个参数的顺序。 返回负整数,零或正整数,因为第一个参数小于, 等于或大于第二个参数。 在前面的描述中,符号sgn( ) 表达式表示数学符号函数, 其定义根据表达式的值是否为负,零或正返回的-1一个,0,或1。

实现程序必须确保sgn(compare(x, y)) == -sgn(compare(y, x))所有x和y。
(这意味着当且仅当compare(y, x)引发异常时, compare(x, y)必须抛出异常。)

实施者还必须确保关系是可传递的: ((compare(x, y)>0) && (compare(y, z)>0))
意味着compare(x, z)>0 。

最后,实施者必须确保compare(x, y)==0 意味着sgn(compare(x, z))==sgn(compare(y,
z))为所有z 。

一般情况,但不是严格要求(compare(x, y)==0) == (x.equals(y)) 。
一般而言,任何违反这种情况的比较方都应清楚地表明这一点。 推荐的语言是“注意:该比较器强制与等于”不一致的排序“。 boolean
equals(Object obj) 指示某个其他对象是否等于此比较器。
该方法必须遵守Object.equals(Object)的一般合同。 另外, 只有指定的对象也是一个比较器,这个方法只能返回true
,并且它与这个比较器的顺序相同。 因此, comp1.equals(comp2)意味着 sgn(comp1.compare(o1,
o2))==sgn(comp2.compare(o1, o2)) 对于每个对象参考o1和o2 。 请注意,
始终安全不要覆盖Object.equals(Object) 。 然而,在某些情况下,覆盖此方法可以通过允许程序确定两个
不同的比较器施加相同的顺序来提高性能。

而真正要实现的是compare方法。需要单独准备出一个类来实现Comparator接口 此类来作为排序类

之前使用Comparable接口的时候利用的是Arrays类中的sort()方法,可是现在
更换一个接口以后,可以使用另外一个sort()方法 public static void sort(T[] a,
Comparator<? super T> c) * * * 请解释Comparator和Comparable *
如果对象数组要进行排序那么必须设置排序规则,可以使用Comparator和Comparable *
java.long.Comparable是在一个类定义的时候,实现好的接口,这样奔雷的对象数组接口 * 下定义有一个public int
compareTo方法, * java.util.Comparator是专门定义一个指定类的比较规则,属于挽救的比较操作 *
public int comparable() public boolean equals()

package leiku;

import java.util.Arrays;
import java.util.Comparator;


```java
class Book131  ///实现比较
{
	private String title;
	private double price;
	
	public Book131() {}
	public Book131(String title,double price)
	{
		this.title = title;
		this.price = price;
	}
	
	@Override
		public String toString() {
			// TODO Auto-generated method stub
			return "书名"+this.title+"价格"+this.price+"\n";
		}
	
	public void setPrice(double price)
	{
		this.price = price;
	}
	
	public double getPrice() 
	{
		return price;
	}
	
	public void setTitle(String title) 
	{
		this.title = title;
	}
	
	public String getTitle()
	{
		return title;
	}
}

/*
 * 定义排序的工具类
 */

class BookComparator implements Comparator<Book131>
{
	@Override
	public int compare(Book131 o1, Book131 o2) 
	{
		// TODO Auto-generated method stub
		if(o1.getPrice()>o2.getPrice())
		{
			return 1;
		}
		else if(o1.getPrice()<o2.getPrice())
		{
			return -1;
		}
		else 
		{
			return 0;
		}
		
	}
}
public class bijiaoqiComparator {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Book131 books[] = new Book131[]
				{
					new	Book131("asda",123),
					new	Book131("asdsdfa",131233),
					new	Book131("assfdsfda",1),
					new	Book131("asafasdfda",131)
				};
		Arrays.sort(books,new BookComparator());
		System.out.println(Arrays.toString(books));
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值