Comparator 和 Comparable

Comparator 和 Comparable 相同点

Comparator 和 Comparable都是java的接口,并且是用来对自定义的class比较大小的。

对于自定义类如:public class Person{ String name; int age }.
  当我们有这么一个personList,里面包含了person1, person2, persion3……,我们用Collections.sort( personList )是得不到预期的结果的。这时肯定有人要问,那为什么可以排序一个字符串list呢,如:
StringList{“hello1” , “hello3” , “hello2”} Collections.sort( stringList )
能够得到正确的排序,那是因为String 这个对象已经帮我们实现了 Comparable接口 , 所以Person 如果想排序, 也要实现一个比较器。

Comparator 和 Comparable 的区别

Comparable
  对于Comparable接口来说,它往往是进行比较类需要实现的接口。
该比较器仅包含一个有compareTo()方法,只有一个参数,返回值为int。返回值大于0表示对象大于参数对象;小于0表示对象小于参数对象;等于0表示两者相等。

Comparable 实现在 Person类的内部:
public class Persion implements Comparable {…compareTo() 比较Person的大小…}
  因为已经实现了比较器,那么Person现在是一个可以比较大小的对象了,它的比较功能和String完全一样,可以随时随地的拿来比较大小,因为Person现在自身就是有大小之分的。Collections.sort(personList)可以得到正确的结果。

Comparator
  对于Comparator接口来说,它的实现者被称为比较器,它包含一个compare()方法,有两个参数,返回值与Comparable的compareTo()方法一样,不同之处是Comparator接口一般不会被集合元素类所实现,而是单独实现或者匿名内部类方式实现。

Comparator 实现在Person的外部,此时Person类的结构不需要有任何变化,如:
public class Person{ String name; int age }
  然后另外定义一个比较器类:
public PersonComparator implements Comparator {…compare() 比较Person的大小…}
  在PersonComparator里面实现了怎么比较两个Person的大小。 所以,用这种方法,当要对一个 personList进行排序的时候,除了要传递personList过去,还需要把PersonComparator传递过去,因为怎么比较Person的大小是在PersonComparator里面实现的,如:Collections.sort( personList , new PersonComparator() )

import java.util.ArrayList;  
import java.util.Collections;  
import java.util.Comparator;  
import java.util.List;  public class CompareTest {  public static void main(String[] args) {  List<Student> list = new ArrayList<Student>(10);  list.add(new Student(1,"jj"));  list.add(new Student(0,"ww"));  list.add(new Student(0,"kk"));  list.add(new Student(2,"ll"));  Collections.sort(list); // 内部比较器:要排序的类实现Comparable接口,可以对自身进行比较  System.out.println(list);  List<Teacher> t = new ArrayList<Teacher>(10);  t.add(new Teacher(1,12));  t.add(new Teacher(0,13));  t.add(new Teacher(0,14));  t.add(new Teacher(2,15));  Collections.sort(t,new StudentComparator()); //外部比较器:通过额外的类来实现Comparator接口  System.out.println(t);  }  
}  
class Student implements Comparable {  int num;  String name;  public Student(int num, String name) {  this.num = num;  this.name = name;  }  @Override  public String toString() {  return "\r\tnum:"+num+" name:"+name+"\r";  }  public int compareTo(Object o) {  Student tmp = (Student) o;  int result = tmp.num > num ? 1 : (tmp.num==num ? 0 : -1);  if (result == 0) {  result = tmp.name.indexOf(0) > name.indexOf(0) ? 1 : -1;  }  return result;  }  
}  
class Teacher{  int num;  double salary;  public Teacher(int num, double salary) {  this.num = num;  this.salary = salary;  }  @Override  public String toString() {  return "\r\tnum:"+num+" salary:"+salary+"\r";  }      
}  class StudentComparator implements Comparator{  public int compare(Object o1, Object o2) {  Teacher t1 = (Teacher) o1;  Teacher t2 = (Teacher) o2;  int result = t1.num > t2.num ? 1 : (t1.num == t2.num ? 0 : -1);  return result = result == 0 ?(t1.salary<t2.salary ? 1 : -1) : result;  }   
}  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/325347.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

利用JEXL实现动态表达式编译

转载自 利用JEXL实现动态表达式编译 背景 做项目突然遇到这样的需求: 系统要获取多个数据源的数据&#xff0c;并进行处理&#xff0c;最后输出多个字段。字段的计算规则一般是简单的取值最多加一点条件判断。 而且需要动态变动&#xff01;&#xff01;例如一个字段a的取值…

《四世同堂》金句摘抄(二)

System.out.println("今天读的是什么书呢&#xff1f;"); String bname "《四世同堂》"; System.out.println("今天读的书是&#xff1a;"bname);Console.WriteLine("今天读的是什么书呢&#xff1f;"); String bname "《四世同…

码农不重视文档:开源项目深受其苦

GitHub 刚刚发布了《2017 开源调查》报告&#xff0c;这家知名编程社交网站走访了 github.com 社区内 3800 多个项目和超过 5500 名成员&#xff0c;并且与 500 名在 GitHub 项目生态系统之外的编程者们进行了交谈。本次调查涉及多方面&#xff0c;比如人们在为开源项目做开发、…

kafka监控软件kafka-eagle搭建 web无法访问

https://www.likecs.com/show-204789016.html

《四世同堂》金句摘抄(三)

System.out.println("今天读的是什么书呢&#xff1f;"); String bname "《四世同堂》"; System.out.println("今天读的书还是&#xff1a;"bname);Console.WriteLine("今天读的是什么书呢&#xff1f;"); String bname "《四世…

[翻译]编写高性能 .NET 代码 第一章:性能测试与工具 -- 平均值 vs 百分比

平均值 vs 百分比 在考虑要性能测试的目标值时&#xff0c;我们需要考虑用什么统计口径。大多数人都会首选平均值&#xff0c;但在大多数情况下&#xff0c;这个正确的&#xff0c;但你也应该适当的考虑百分数。但你有可用性的要求&#xff0c;作为性能测试的目标里肯定会有用…

《四世同堂》金句摘抄(四)

System.out.println("今天读的是什么书呢&#xff1f;"); String bname "《四世同堂》"; System.out.println("今天读的书还是&#xff1a;"bname); System.out.println("在摘抄一下");下面是今天的摘抄内容 生在某一种文化中的人&a…

面对枯燥的源码,如何才能看得下去

转载自 面对枯燥的源码&#xff0c;如何才能看得下去 一个软件开发人员&#xff0c;工作到了一定的年限&#xff08;一般是3、4年左右&#xff09;&#xff0c;如果他还没学会阅读源码&#xff0c;那么他就会遇到瓶颈。因为到了这个时候的开发&#xff0c;他应该不仅仅只会做…

前端防xss攻击(去掉空格等能影响和攻击数据库的字段)

用法&#xff1a;把要传给后端的数据放到此能过滤的函数里面即可就能实现自动过滤的功能 eg 代码 export function XSSFilter(str: string) {// 过滤emoji表情str str.replace(/\uD83C[\uDF00-\uDFFF]|\uD83D[\uDC00-\uDE4F]/g, );// 过滤所有html标签str str.replace(/&l…

《四世同堂》金句摘抄(五)

System.out.println("今天读的是什么书呢&#xff1f;"); String bname "《四世同堂》"; System.out.println("今天读的书还是&#xff1a;"bname); System.out.println("在摘抄一下");他们呆呆的看着他。惊异&#xff0c;怜悯&#…

[深圳/广州]微软SQL技术沙龙分享会(MVP)

[深圳/广州] 新一期俱乐部活动报名开始&#xff0c;这次是广深地区SQL Server 技术沙龙分享会&#xff08;MVP)&#xff0c;SQL Server作为一个数据平台&#xff0c;不管是SQL Server 2017 on Linux 还是把一门开源R语言融入其最赚钱的旗舰商业数据库&#xff0c;微软已经决定&…

搜索时展示的是名字,传给后端的是id

展示普通的select框 const [typeList, setTypeList] useState(["增加","减少"]);<Form.Item name"fruitType" label"类型" rules{[{ required: true }]}><Select style{{width:500}} placeholder"请选择类型">…

IntelliJ IDEA 2018.2 发布,支持 Java 11

转载自 IntelliJ IDEA 2018.2 发布&#xff0c;支持 Java 11 近期&#xff0c;JetBrains发布了其旗舰产品IntelliJ IDEA的2018.2版本。新版本支持即将推出的Java 11、断点意图&#xff08;Breakpoints Intentions&#xff09;、MacBook的Touch Bar等特性&#xff0c;并改进了…

发布支持多线程的PowerShell模块 —— MultiThreadTaskRunner

应用场景 多线程在需要批量处理一些任务的时候相当有用&#xff0c;也更加有利于充分利用现有计算机的能力。所有主流的开发语言都支持多线程。 默认情况下&#xff0c;PowerShell作为一个脚本语言&#xff0c;是不支持多线程操作的&#xff0c;虽然有所谓的后台任务&#xf…

java中,在一个有序数组中插入元素,使得数组保持有序排列

//已知有一个数组&#xff0c;/*数组里面的元素有a b c d e f y z,从控制台中随机输入一个字母&#xff0c;按照升序的顺序插入到该数组中并且遍历输出。*/public static void test1(){String [] str{"a","b","c","d","e",&…

架构师必须掌握的 10 条设计原则

转载自 架构师必须掌握的 10 条设计原则 01、 遵循单一职责原则 函数是程序员的工具中最重要的抽象形式。它们能更多地被重复使用&#xff0c;你需要编写的代码就越少&#xff0c;代码也因此变得更可靠。较小的函数遵循单一职责原则更有可能被重复使用。 02、 尽量减少共享…

《四世同堂》金句摘抄(六)

System.out.println("这两天还是读的《四世同堂》"); System.out.println("这本书好长啊"); System.out.println("不断的听&#xff0c;不断的看&#xff0c;才到1000多页");今天的金句摘抄&#xff1a; 她翻滚的闹&#xff0c;整桶的流泪&…

[翻译]编写高性能 .NET 代码 第一章:工具介绍 -- Visual Studio

Visual Studio vs虽然不是全宇宙唯一的IDE&#xff0c;但它是.net开发人员最常用的开发工具。它自带一个性能分析工具&#xff0c;你可以使用它来做开发&#xff0c;不同的vs版本在工具上会略有差别。 VS可以分析CPU使用率&#xff0c;内存分配以及资源锁情况。它能在你开发与…