java常用类库---比较器(Comparable,Comparator)
一,本章目标
掌握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)相关推荐
- java 常用类库_JAVA(三)JAVA常用类库/JAVA IO
成鹏致远 |lcw.cnblog.com|2014-02-01 JAVA常用类库 1.StringBuffer StringBuffer是使用缓冲区的,本身也是操作字符串的,但是与String类不同, ...
- Java_08 快速入门 Java常用类库
目录 第一章:Java常用类库 1.1 StringBuffer类 范例1-1:观察StringBuffer基本使用. 范例1-2:取得CharSequence接口实例化对象. 范例1-3:Stri ...
- Java常用类库API
Java常用类库API 字符串操作 String类 String两种赋值方式 String类中的构造函数 String()方法 String(byte[] bytes)方法 String(byte[] ...
- Java常用类库之String
Java常用类库之String学习与积累 概述 在学习Java时,我们知道Java的基本数据类型有整型的int,byte,short,long,字符型的char,布尔型的Boolean和浮点型的flo ...
- Java常用类库以及简介,具体使用细节进行百度(爬虫爬取的数据)
来至于互联网 Office文档的Java处理包 POI [推荐] Apache POI是一个开源的Java读写Excel.WORD等微软OLE2组件文档的项目.目前POI已经有了Ruby版本. 结构: ...
- JAVA笔记:Java常用类库
这篇文章我们来总结下Java中的常用类库.类库中的这些类和方法都是精心设计的,其运行的效率高.质量高,这些类和方法几乎包含在所有的Java软件中,所以可移植性很高. 下面我们详细学习下. String ...
- java常用类库以及集合
常用类库 泛型 概述 使用 泛型类 泛型接口 泛型方法 泛型限制类型 泛型中的通配符 " ? " 作用 注意 Arrays arrays的常用的方法 Math 常用方法 Date ...
- Java常用类库(Object类、String类、StringBuffer类、包装类、Math类、System类)详解
常用类库 java.lang java.lang包下放置了Java开发中常用的类和接口,所以为简化该包下类的使用,java.lang包下的类在使用时不需要导入这些类 java.lang包下常用类有: ...
- Java常用类库学习总结
常用类库 包装类 Java中不能定义基本数据类型的对象,为了能将基本数据类型当作对象处理,包装类由此诞生! 概念: 将基本数据类型封装在包装类中,以便把这些基本数据类型转换为对象进行处理 包装类以及所 ...
最新文章
- 为何 NLP 领域难以出现“独角兽”?
- 【笔试面试考试】C++基础知识点[转]
- java 判断一个数字是2倍数_如何判断语言发育迟缓的原因|一个2岁半不会说话的案例...
- linux shell 判断字符串是否为数字
- 导致SEO优化排名不理想的三大因素,你踩雷了没?
- latch free:SQL memory manager latch
- Android应用安全之Content Provider安全
- 刷新ImageNet最高分!谷歌发布最强Transformer
- [BZOJ1135][P3488][POI2009]LYZ[线段树+Hall定理]
- 静态成员函数与成员变量_C++静态成员变量及函数
- 95-30-015-Channel-AbstractNioMessageChannel
- 单变量微积分笔记8——最值问题和相关变率
- OAuth2.0_授权服务配置_Spring Security OAuth2.0认证授权---springcloud工作笔记140
- Idea中上传项目到Github
- 【5003】马遍历问题
- linux中byte数组长度,android – JNI:如何获得jbyteArray大小
- 用于计算成像的超材料
- 计算机键盘上的每一个按键读音,电脑键盘上各键的名称功能及作用.doc
- 【Hardware】【天线基础知识】
- PID调控公式和相关方法