Java中Comparable和Comparator的使用方法
来源:互联网 发布:烈焰战车10级升级数据 编辑:程序博客网 时间:2024/06/01 20:40
Java中Comparable和Comparator的使用方法
- Java中Comparable和Comparator的使用方法
- 内置引用类型的比较
- Comparable用法
- Comparator用法
- 使用Collections对容器的比较
- 自定义数据排序
- Comparable
- Comparator
- 内置引用类型的比较
内置引用类型的比较
Comparable用法
这些类会继承Comparable接口,实现compareTo方法,通过该方法来实现对象之间比较。例如String:
String str="abc"; //如果其中一个是例外一个起始开始的子串,返回长度之差String str2 ="abcd123"; //否则返回第一个不相等的unicode码之差System.out.println(str.compareTo(str2));str ="abc";str2 ="aad";System.out.println(str.compareTo(str2));
String内部继承Comparable接口,实现compareTo方法:
public int compareTo(String anotherString) { int len1 = value.length; int len2 = anotherString.value.length; int lim = Math.min(len1, len2);//获取两个字符串中最小的长度 char v1[] = value; char v2[] = anotherString.value; int k = 0; while (k < lim) { char c1 = v1[k]; char c2 = v2[k]; if (c1 != c2) { return c1 - c2; } k++; } return len1 - len2; }
可用作引用类型集合的排序,封装一排序工具类Utils
public class Utils { /** * 容器排序 (使用泛型方法) */ 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; } } } }
Comparator用法
我们还可以额外创建一个实现了Comparator接口的比较类来对集合进行排序,Comparator独立与实体类,便于应对各种排序规则。例如:
/** * 排序规则的业务类 * @author Administrator * */public class StrComparator implements java.util.Comparator<String>{ /** * 按长度比较大小 * 正数 > * 负数 < * 0 == */ @Override public int compare(String o1, String o2) { int len1 =o1.length(); int len2 =o2.length(); return -(len1-len2); }}
封装排序工具类:
public class Utils { /** * List的排序+比较器 * @param list * @param com */ 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])); } } /** * 数组的排序 (降序)+Comparator接口 * @param arr */ 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; } } }}
使用方法:
list =new ArrayList<String>();list.add("a");list.add("abcd");list.add("abc");list.add("def");Utils.sort(list,new StrComparator());System.out.println(list);
使用Collections对容器的比较
//ComparatorList<String> list =new ArrayList<String>();list.add("a");list.add("abcd");list.add("abc");list.add("def");Collections.sort(list,new StrComparator());System.out.println(list);//使用String默认排序list =new ArrayList<String>();list.add("a");list.add("abcd");list.add("abc");list.add("def");Collections.sort(list);System.out.println(list);
自定义数据排序
Comparable
用Comparable方式实现新闻条目排序,直接上代码:
public class News implements java.lang.Comparable<News>{ //标题 private String title; //点击量 private int hits; //时间 private Date publishTime; public News() { } public News(String title, int hits, Date pubTime) { super(); this.title = title; this.hits = hits; this.publishTime = 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 publishTime; } public void setPubTime(Date pubTime) { this.publishTime = pubTime; } //首先按时间降序 +再按点击量升序+再按标题降序 @Override public int compareTo(News o) { int result =0; //时间降序 result =this.publishTime.compareTo(o.publishTime); 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.publishTime)); sb.append(",点击量:").append(this.hits).append("\n"); return sb.toString(); } }
实现排序
List<News> news=new ArrayList<News>(); news.add(new News("国产第十艘航母下水了",15000,new Date(System.currentTimeMillis()-1000*60*60))); news.add(new News("乐天集团倒闭了",16000,new Date())); news.add(new News("中国统一台湾",60000,new Date(System.currentTimeMillis()-1000*60*60))); System.out.println("排序前:"+news); //排序 //Collections.sort(news); Utils.sort(news); System.out.println("排序后"+news);
Comparator
实体类
public class Goods { //商品名称 private String name; //价格 private double price; //销量 private int salesNum; public Goods() { } public Goods(String name, double price, int salesNum) { super(); this.name = name; this.price = price; this.salesNum = salesNum; } 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 getSalesNum() { return salesNum; } public void setSalesNum(int salesNum) { this.salesNum = salesNum; } @Override public String toString() { return "商品名称:"+name+",销量"+this.salesNum+",价格:"+this.price+"\n"; }}
实现Comparator接口,按销量排序的业务类 (降序)
public class GoodsSalesNumCompare implements java.util.Comparator<Goods> { @Override public int compare(Goods good1, Goods good2) { return -(good1.getSalesNum()-good2.getSalesNum()); }}
实现Comparator接口,按价格排序的业务类 (降序)
public class GoodsPriceCompare implements java.util.Comparator<Goods> { @Override public int compare(Goods good1, Goods good2) { return -(good1.getPrice()-good2.getPrice()>0?1:(good1.getPrice()==good2.getPrice()?0:-1)); }}
实现排序
List<Goods> list =new ArrayList<Goods>();list.add(new Goods("iphone7plus",6300,2000));list.add(new Goods("华为P10",3600,12000));list.add(new Goods("小米MIX",3500,10000));System.out.println("排序前:"+list);Collections.sort(list,new GoodsSalesNumCompare());//商品按销售数量降序排序//Collections.sort(list,new GoodsPriceCompare());//商品按价格降序排序System.out.println("排序后:"+list);
0 0
- Java中Comparable和Comparator的使用方法
- java中comparable和 comparator的区别
- java中Comparator 和 Comparable 的区别
- Java中Comparator和Comparable的区别
- Java中Comparable和Comparator的比较
- Java中Comparable和Comparator的区别
- JAVA中Comparable和Comparator的区别
- Java中Comparable和Comparator的辨析
- Java中comparable和comparator的区别
- Java中Comparable和Comparator的用法
- Java中Comparable和Comparator
- java中Comparable 和Comparator
- Java 中 Comparable 和 Comparator
- java中comparable和comparator
- java的Comparator和Comparable
- java的Comparator和Comparable
- java的Comparator和Comparable
- java的Comparator和Comparable
- Linux下打包压缩war、解压war包和jar命令
- 2.安卓app自动化测试-初识python调用appium
- PHPExcel 修改已存在Excel
- __name__ == '__main__'
- 数据库设计的三大范式
- Java中Comparable和Comparator的使用方法
- SPV中如何利用默克尔树证明某个交易是否存在
- 题目1013:开门人和关门人
- 阿里巴巴 Java 开发手册--集合学习笔记
- kerberos安装
- yii2.0缓存篇之片段缓存
- AEAI DP创建弹窗
- Kettle7 ( Pentaho Data Integration )源码分析 每个step都有一个线程负责运行
- Git基础命令