Java比较器的应用

    Java中进行比较的时候分为两种,一种是比较Java内置的数据类型,另一种是自定义数据类型之间的比较,下面就这两个方面进行介绍一下。

一、Java内置数据类型的比较

         Java中的容器包括数组和集合两部分,下面从数组和集合两种容器来介绍Java内置数据类型的比较。

首先是数组的比较,需要传入的参数是以个存放任意一个对象的数组arr和一个比较器的对象com,首先假定数组有序,然后利用for循环进行比较,利用com的compare方法进行比较,每进行一次比较就把sorted设为false,如果数组有序则直接跳出循环。

<span style="font-size:18px;">public static <T> void sort(Object[] arr,Comparator<T> com){
		//从大到小排序 降序
			boolean sorted= true;
			int len =arr.length;
			for(int j=0;j<len-1;j++){ //趟数
				sorted =true; //假定有序
				for(int i=0;i<len-1-j;i++){ //次数
					if(com.compare((T)arr[i], (T)arr[i+1])<0){
						Object temp = arr[i];
						arr[i] =arr[i+1];
						arr[i+1] =temp;
						sorted =false; //假定失败
					}
				}
				if(sorted){ //减少趟数
					break;
				}
			}
	}</span>
       然后是集合的比较,集合的比较比较简单,可以先将集合转换为数组,然后利用上面的排序算法进行排序,排序结束后再一一改变集合中的值

<span style="font-size:18px;">public static  <T> void sort(List<T> list,Comparator<T> com){
		//第一步:转成数组
		Object[] arr =list.toArray();
		sort(arr,com);
		//第二步:改变容器中对应的值
		for(int i=0;i<arr.length;i++){
			list.set(i, (T)(arr[i]));
		}
	}</span>
       当使用泛型之后,就不必手工传入Comparator对象即

<span style="font-size:18px;">/**
	 * 容器排序 (使用泛型方法)
	 */
	public static <T extends Comparable<T>> void sort(List<T> list){
		//第一步:转成数组
		Object[] arr =list.toArray();
		sort(arr);
		//第二步:改变容器中对应的值
		for(int i=0;i<arr.length;i++){
			list.set(i, (T)(arr[i]));
		}
		
	}
	
	
	/**
	 * 数组排序 (使用泛型方法)
	 */
	public static <T extends Comparable<T>> void sort(T[] arr){
		//从大到小排序 降序
		boolean sorted= true;
		int len =arr.length;
		for(int j=0;j<len-1;j++){ //趟数
			sorted =true; //假定有序
			for(int i=0;i<len-1-j;i++){ //次数
				if(((Comparable)arr[i]).compareTo(arr[i+1])<0){
					T temp = arr[i];
					arr[i] =arr[i+1];
					arr[i+1] =temp;
					sorted =false; //假定失败
				}
			}
			if(sorted){ //减少趟数
				break;
			}
		}
	}	</span>

二、自定义类型的比较

        对于自定义类型的数据进行比较有两种方式,一种是实体类不动,业务类实现comparator接口并重写compare方法,第二种是实体类实现Comparable接口并重写compareto方法,第一种可以实现与实体类的分离,可以应对多变的排序规则

第一种方案,实体类不动业务类实现comparator接口并重写compare

实体类

public class Goods {
	//商品名称
	private String name;
	//价格
	private double price;
	//收藏量
	private int fav;
	public Goods() {
		// TODO Auto-generated constructor stub
	}
	
	
	
	public Goods(String name, double price, int fav) {
		super();
		this.name = name;
		this.price = price;
		this.fav = fav;
	}



	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public double getPrice() {
		return price;
	}
	public void setPrice(double price) {
		this.price = price;
	}
	public int getFav() {
		return fav;
	}
	public void setFav(int fav) {
		this.fav = fav;
	}
	
	
	@Override
	public String toString() {
		return "商品名:"+name+",收藏量"+this.fav+",价格:"+this.price+"\n";
	}
}
按价格排序的业务类(降序)
<span style="font-size:18px;">public class GoodsPriceComp implements java.util.Comparator<Goods> {

	@Override
	public int compare(Goods o1, Goods o2) {
		return -(o1.getPrice()-o2.getPrice()>0?1:(o1.getPrice()==o2.getPrice()?0:-1));
	}

}
package com.bjsxt.sort.refType;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class GoodsApp {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		List<Goods> list =new ArrayList<Goods>();
		list.add(new Goods("老马视频",100,2000));
		list.add(new Goods("老高视频",50,2000));
		list.add(new Goods("老裴视频",1000,1000));
		System.out.println("排序前:"+list);
	//	Collections.sort(list,new GoodsPriceComp());
		Collections.sort(list,new GoodsFavComp());
		System.out.println("排序后:"+list);
	}

}
</span>

第二种实体类实现Comparable接口并重写compareTo方法

新闻条目实体类

public class NewsItem implements java.lang.Comparable<NewsItem>{
	//标题
	private String title;
	//点击量
	private int hits;
	//时间
	private Date pubTime;
	public NewsItem() {
	}
	
	
	public NewsItem(String title, int hits, Date pubTime) {
		super();
		this.title = title;
		this.hits = hits;
		this.pubTime = pubTime;
	}


	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public int getHits() {
		return hits;
	}
	public void setHits(int hits) {
		this.hits = hits;
	}
	public Date getPubTime() {
		return pubTime;
	}
	public void setPubTime(Date pubTime) {
		this.pubTime = pubTime;
	}

	//时间降序 +点击量升序+标题降序
	@Override
	public int compareTo(NewsItem o) {
		int result =0;
		//比较 时间
		result =-this.pubTime.compareTo(o.pubTime); //降序
		if(0==result){ //时间相同
			//点击量 
			result =this.hits-o.hits; //升序
			if(0==result){ //点击量相同
				 //标题
				result=-this.title.compareTo(o.title);//降序
			}
		}		
		
		return result;
	}
	
	@Override
	public String toString() {
		StringBuilder sb =new StringBuilder();
		sb.append("标题:").append(this.title);
		sb.append(",时间:").append(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.pubTime));
		sb.append(",点击量:").append(this.hits).append("\n");
		return sb.toString();
	}

	
}

到此,Java中的比较方法就介绍完了,谢谢大家的阅读!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值