Java比较器的应用

来源:互联网 发布:删除rom内置软件 编辑:程序博客网 时间:2024/04/30 23:11

    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;}@Overridepublic String toString() {return "商品名:"+name+",收藏量"+this.fav+",价格:"+this.price+"\n";}}
按价格排序的业务类(降序)
<span style="font-size:18px;">public class GoodsPriceComp implements java.util.Comparator<Goods> {@Overridepublic 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;}//时间降序 +点击量升序+标题降序@Overridepublic 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;}@Overridepublic 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 0
原创粉丝点击