一,本章目标

掌握Comparable比较接口的使用

了解比较器的基本排序原理

掌握Comparator比较接口的使用

二,具体内容

Comparable接口:

之前在Arrays中存在sort方法,能够对对象数组进行排序,但是此方法中的对象数组必须实现comparable接口,定义指定排序接口。

此接口存在只一个compareTo方法。

要求:定义一个学生类,有姓名,年龄,成绩,按照成绩从高到低排序,如果成绩相等则按照年龄从小到大排序。

package 比较器;import java.util.Arrays;public class Demo {/*** @param args*/public static void main(String[] args) {// TODO Auto-generated method stubStudent stu[] = {new Student("张三",20,90.0f),new Student("李四",22,90.0f),new Student("王五",20,99.0f),new Student("赵六",20,70.0f),new Student("孙七",22,100.0f)};Arrays.sort(stu);for(int i=0;i<stu.length;i++){System.out.println(stu[i]);}}}
class Student implements Comparable<Student>{private String name;private int age;private float grade;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public float getGrade() {return grade;}public void setGrade(float grade) {this.grade = grade;}@Overridepublic String toString() {return "Student [name=" + name + ", age=" + age + ", grade=" + grade+ "]";}public Student(String name, int age, float grade) {super();this.name = name;this.age = age;this.grade = grade;}@Overridepublic int compareTo(Student o) {// TODO Auto-generated method stubif(this.grade > o.grade){return -1;}else if(this.grade < o.grade){return 1;}else{if(this.age > o.age){return 1;}else if(this.age < o.age){return -1;}else{return 0;}}}}


对于比较器的排序原理:

实际上比较器的操作,就是经常听到二叉树的排序算法。

基本原理:使用第一个元素作为跟节点,如果后面的内容比跟节点要小,则放在左子树,如果要大,就放在右子树。

然后按照中序排序取出来。

二叉树算法的例如如下:

package 比较器;public class Demo2 {/*** @param args*/public static void main(String[] args) throws Exception {// TODO Auto-generated method stubBinaryTree bt = new BinaryTree();bt.add(8);bt.add(3);bt.add(3);bt.add(10);bt.add(9);bt.add(1);bt.add(5);bt.add(5);System.out.println("排序之后的结果:");bt.print();}}
class BinaryTree{class Node{private Comparable data;//具体的内容private Node left;//保存左子树private Node right;//保存右子树public Node(Comparable date){this.data = date;}public void addNode(Node newNode){if(newNode.data.compareTo(this.data) < 0){//内容小,放在左子树if(this.left == null){     //如果当前左子树是空就把内容放进去this.left = newNode;}else{this.left.addNode(newNode);//当前左子树有内容了,继续向下潘丹}}if(newNode.data.compareTo(this.data)>= 0){//内容大,放在右子树if(this.right == null){     //如果当前右子树是空就把内容放进去this.right = newNode;}else{this.right.addNode(newNode);//当前右子树有内容了,继续向下潘丹}}}public void printNode(){//输出的时候采用中序遍历if(this.left != null){this.printNode();//不断输出左子树}System.out.print(this.data + "\t");if(this.right != null){this.right.printNode();//输出右子树}}}private Node root;//根元素public void add(Comparable data){//加入元素Node newNode = new Node(data);//定义新节点if(root==null){   //判断是否存在根节点root = newNode;}else{root.addNode(newNode); //确定放在左子树还是右子树}}public void print(){this.root.printNode();}
}

另一种比较器:Comparator

下面定义一个自己的类,没有实现Comparable接口。

class StudentTwo {private String name;private int age;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Student [name=" + name + ", age=" + age + "]";}public StudentTwo(String name, int age) {super();this.name = name;this.age = age;}public boolean equals(Object obj){if(this==obj){return true;}if(!(obj instanceof StudentTwo)){return false;}StudentTwo stu = (StudentTwo) obj;if(stu.name.equals(this.name) && stu.age==this.age){return true;}else{return false;}}}

此类不存在排序功能,为了让此类能够排序,所以必须为此类单独定义一个比较器,此比较器实现Comparaot接口。

class StudentComparator implements Comparator<StudentTwo>{public int compare(StudentTwo s1,StudentTwo s2){if(s1.equals(s2)){return 0;}else if(s1.getAge() < s2.getAge()){return 1;}else{return -1;}}

定义了一个第三方排序器,按照年龄排序。

三,总结

在使用中,尽可能实现Comparable,在需要排序的类中上定义好此接口。

掌握一点:只要是对象排序,在java中要以Comparable接口为准

java常用类库---比较器(Comparable,Comparator)相关推荐

  1. java 常用类库_JAVA(三)JAVA常用类库/JAVA IO

    成鹏致远 |lcw.cnblog.com|2014-02-01 JAVA常用类库 1.StringBuffer StringBuffer是使用缓冲区的,本身也是操作字符串的,但是与String类不同, ...

  2. Java_08 快速入门 Java常用类库

    目录 第一章:Java常用类库 1.1  StringBuffer类 范例1-1:观察StringBuffer基本使用. 范例1-2:取得CharSequence接口实例化对象. 范例1-3:Stri ...

  3. Java常用类库API

    Java常用类库API 字符串操作 String类 String两种赋值方式 String类中的构造函数 String()方法 String(byte[] bytes)方法 String(byte[] ...

  4. Java常用类库之String

    Java常用类库之String学习与积累 概述 在学习Java时,我们知道Java的基本数据类型有整型的int,byte,short,long,字符型的char,布尔型的Boolean和浮点型的flo ...

  5. Java常用类库以及简介,具体使用细节进行百度(爬虫爬取的数据)

    来至于互联网 Office文档的Java处理包 POI [推荐] Apache POI是一个开源的Java读写Excel.WORD等微软OLE2组件文档的项目.目前POI已经有了Ruby版本. 结构: ...

  6. JAVA笔记:Java常用类库

    这篇文章我们来总结下Java中的常用类库.类库中的这些类和方法都是精心设计的,其运行的效率高.质量高,这些类和方法几乎包含在所有的Java软件中,所以可移植性很高. 下面我们详细学习下. String ...

  7. java常用类库以及集合

    常用类库 泛型 概述 使用 泛型类 泛型接口 泛型方法 泛型限制类型 泛型中的通配符 " ? " 作用 注意 Arrays arrays的常用的方法 Math 常用方法 Date ...

  8. Java常用类库(Object类、String类、StringBuffer类、包装类、Math类、System类)详解

    常用类库 java.lang java.lang包下放置了Java开发中常用的类和接口,所以为简化该包下类的使用,java.lang包下的类在使用时不需要导入这些类 java.lang包下常用类有: ...

  9. Java常用类库学习总结

    常用类库 包装类 Java中不能定义基本数据类型的对象,为了能将基本数据类型当作对象处理,包装类由此诞生! 概念: 将基本数据类型封装在包装类中,以便把这些基本数据类型转换为对象进行处理 包装类以及所 ...

最新文章

  1. 为何 NLP 领域难以出现“独角兽”?
  2. 【笔试面试考试】C++基础知识点[转]
  3. java 判断一个数字是2倍数_如何判断语言发育迟缓的原因|一个2岁半不会说话的案例...
  4. linux shell 判断字符串是否为数字
  5. 导致SEO优化排名不理想的三大因素,你踩雷了没?
  6. latch free:SQL memory manager latch
  7. Android应用安全之Content Provider安全
  8. 刷新ImageNet最高分!谷歌发布最强Transformer
  9. [BZOJ1135][P3488][POI2009]LYZ[线段树+Hall定理]
  10. 静态成员函数与成员变量_C++静态成员变量及函数
  11. 95-30-015-Channel-AbstractNioMessageChannel
  12. 单变量微积分笔记8——最值问题和相关变率
  13. OAuth2.0_授权服务配置_Spring Security OAuth2.0认证授权---springcloud工作笔记140
  14. Idea中上传项目到Github
  15. 【5003】马遍历问题
  16. linux中byte数组长度,android – JNI:如何获得jbyteArray大小
  17. 用于计算成像的超材料
  18. 计算机键盘上的每一个按键读音,电脑键盘上各键的名称功能及作用.doc
  19. 【Hardware】【天线基础知识】
  20. PID调控公式和相关方法

热门文章

  1. (转贴)解析SNS社区产品架构模型
  2. python解析xml文件最好选用的模块_用Python解析XML文件
  3. 人工智能(AI)产生影响
  4. Exclusive-OR hdu3234
  5. 胖了,也是该减减肥了
  6. OpenFlow:Enabling Innovation in Campus Networks 译文
  7. 家用路由器选购指南基于2019年5月(二)
  8. 对“初链”混合共识、双链结构和抗ASIC挖矿算法的详解
  9. IOS之RSA加密解密与后台之间的双向加密详解
  10. iOS开发 RSA加密解密与后台之间的双向加密详解