Java 关于对象之间的比较 , 容器中的数据的排序
来源:互联网 发布:新建视图 sql语句 编辑:程序博客网 时间:2024/06/14 23:12
Java对象排序
基本类型排序 :
* 就是按照数据的大小排序* 有很多排序算法;
引用类型的排序 :
1. 内置对象排序 : 已经有了该对象的排序规则2. 自定义类的对象的排序 : 需要自己定义对象的排序规则,依照类的内部属性排序;
内置引用数据类型之间的比较
- Integer,Double等数值类 , 直接使用真实数字之间的差值
- String :—-》 如果str2是str1从头开始的字串(长度不相等) ,return str1.length - str2.length;
—-》 如果str1与str2有不相等的字符串 , 则直接返回两个字符unicode字符之间的差值; - Date : 比较当前对象 和 待比较对象的getTime()之差;
实体类实现 java.lang.Comparable 接口 :
- 可以排序的对象需要实现Comparable 接口当中的CompareTo方法 : 返回 0 -1 1;
如下例子 : Student实体类之间使用分数来比较大小
package club.dohacker.Demo;class Student implements Comparable<Student>{ private String name; private int fenshu; //constructor public Student(String name,int fenshu){ this.name = name; this.fenshu = fenshu; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getFenshu() { return fenshu; } public void setFenshu(int fenshu) { this.fenshu = fenshu; } @Override public int compareTo(Student arg0) { return this.fenshu - arg0.fenshu; }}public class Demo1 { public static void main(String[] args) { Student stu1 = new Student("张三",100); Student stu2 = new Student("李四",90); if(stu1.compareTo(stu2) >0){ System.out.println("张三 的 分数 高于 李四的"); }else if(stu1.compareTo(stu2) ==0){ System.out.println("张三 的 分数 等于 李四的"); }else{ System.out.println("张三 的 分数 小于 李四的"); } }}
创建一个的排序器类 ,实现kjava.lang.comparetor接口 :
- 作用 :
- 解耦 : 独立于实体类
- 方便 : 便于应对各种排序规则
如下例子 : Student实体类之间使用分数来比较大小
package club.dohacker.Demo;import java.util.Comparator;//创建一个独立于实体,但是又是针对此实体的一个比较器class Com implements Comparator<Student>{ @Override public int compare(Student arg0, Student arg1) { return arg0.getFenshu() - arg1.getFenshu(); }}class Student { private String name; private int fenshu; //constructor public Student(String name,int fenshu){ this.name = name; this.fenshu = fenshu; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getFenshu() { return fenshu; } public void setFenshu(int fenshu) { this.fenshu = fenshu; }}public class Demo1 { public static void main(String[] args) { Student stu1 = new Student("张三",100); Student stu2 = new Student("李四",90); Com com = new Com(); if(com.compare(stu1,stu2) >0){ System.out.println("张三 的 分数 高于 李四的"); }else if(com.compare(stu1,stu2) == 0){ System.out.println("张三 的 分数 等于 李四的"); }else{ System.out.println("张三 的 分数 小于 李四的"); } }}
Collections工具类的使用
- 针对Comparable接口的排序 :
- 针对Comparator接口的排序 :
Collections.sort(List list) —-> 此类表示list中存放对象的类
必须继承了comparable接口实现了compareTo方法 ,
如下代码
package club.dohacker.Demo;import java.util.ArrayList;import java.util.Collections;import java.util.List;class Student implements Comparable<Student>{ private String name; private int fenshu; //constructor public Student(String name,int fenshu){ this.name = name; this.fenshu = fenshu; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getFenshu() { return fenshu; } public void setFenshu(int fenshu) { this.fenshu = fenshu; } @Override public int compareTo(Student stu) { return this.fenshu - stu.getFenshu(); } public String toString(){ return "\n姓名 : "+this.name +" 成绩"+this.fenshu+"\n"; }}public class Demo1 { public static void main(String[] args) { Student stu1 = new Student("张三",100); Student stu2 = new Student("李四",90); List<Student> list = new ArrayList<Student>(); list.add(stu1); list.add(stu2); Collections.sort(list); //输出排序的信息 System.out.println(list); }}
Collections.sort(Listlist,Comparator com)此类集合中的对象可以不实现Comparable接口 , 但是必须拥有一个比较器
代码如下
package club.dohacker.Demo;import java.util.ArrayList;import java.util.Collections;import java.util.Comparator;import java.util.List;class Com implements Comparator<Student>{ @Override public int compare(Student o1, Student o2) { // TODO Auto-generated method stub return o1.getFenshu() - o2.getFenshu(); }}class Student{ private String name; private int fenshu; //constructor public Student(String name,int fenshu){ this.name = name; this.fenshu = fenshu; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getFenshu() { return fenshu; } public void setFenshu(int fenshu) { this.fenshu = fenshu; } public String toString(){ return "\n姓名 : "+this.name +" 成绩"+this.fenshu+"\n"; }}public class Demo1 { public static void main(String[] args) { Student stu1 = new Student("张三",100); Student stu2 = new Student("李四",90); List<Student> list = new ArrayList<Student>(); list.add(stu1); list.add(stu2); Collections.sort(list,new Com()); //输出排序的信息 System.out.println(list); }}
TreeSet
* 提供数据的排序的容器 , 数据元素不能重复* <font color="#FF0000">HashSet 必须重写hashCode 和 equals 方法 , 才能确保Set的核心 Map结构中的Key不重复</font>* TreeSet 不需重写hashCode 和 equals 方法 , 比较等于0直接判断为重复* 针对实现了Comparable 接口的实现类 , 使用TreeSet的默认的构造器就可以了* 针对单独使用的排序器 , 需要使用 new TreeSet(Comparator<? super E > com);来指定构造器* 因此默认构造器中添加的元素必须实现了Comparable 接口;*注意 : TreeSet是在添加数据的时候进行排序的 , 所以再使用时候不要修改数据,所以将实体类的属性修改为final 在构造的时候初始化就可以了;
直接实现Comparable
package club.dohacker.Demo;import java.util.ArrayList;import java.util.Collections;import java.util.List;import java.util.TreeSet;class Student implements Comparable<Student>{ private String name; private int fenshu; //constructor public Student(String name,int fenshu){ this.name = name; this.fenshu = fenshu; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getFenshu() { return fenshu; } public void setFenshu(int fenshu) { this.fenshu = fenshu; } public String toString(){ return "\n姓名 : "+this.name +" 成绩"+this.fenshu+"\n"; } @Override public int compareTo(Student o) { // TODO Auto-generated method stub return this.fenshu - o.getFenshu(); }}public class Demo1 { public static void main(String[] args) { Student stu1 = new Student("张三",100); Student stu2 = new Student("李四",90); Student stu3 = new Student("王五",50); Student stu4 = new Student("赵六",78); Student stu5 = new Student("陈七",69); TreeSet<Student> ts = new TreeSet<Student>(); ts.add(stu1); ts.add(stu2); ts.add(stu3); ts.add(stu4); ts.add(stu5); //输出排序的信息 System.out.println(ts); }}
创建一个排序器
package club.dohacker.Demo;import java.util.Comparator;import java.util.TreeSet;class Com implements Comparator<Student>{ @Override public int compare(Student o1, Student o2) { // TODO Auto-generated method stub return o1.getFenshu() - o2.getFenshu(); }}class Student { private String name; private int fenshu; //constructor public Student(String name,int fenshu){ this.name = name; this.fenshu = fenshu; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getFenshu() { return fenshu; } public void setFenshu(int fenshu) { this.fenshu = fenshu; } public String toString(){ return "\n姓名 : "+this.name +" 成绩"+this.fenshu+"\n"; }}public class Demo1 { public static void main(String[] args) { Student stu1 = new Student("张三",100); Student stu2 = new Student("李四",90); Student stu3 = new Student("王五",50); Student stu4 = new Student("赵六",78); Student stu5 = new Student("陈七",69);// TreeSet<Student> ts = new TreeSet<Student>(); 没有实现comparable,会发生ClassCastException TreeSet<Student> ts = new TreeSet<Student>(new Com()); ts.add(stu1); ts.add(stu2); ts.add(stu3); ts.add(stu4); ts.add(stu5); //输出排序的信息 System.out.println(ts); }}
TreeMap接口如下 :
- 要求key值能实现了Comparable接口
- 否则在构造时候传入针对key元素的排序器 new TreeMap(Comparator
阅读全文
0 0
- Java 关于对象之间的比较 , 容器中的数据的排序
- 对象之间的比较
- 对象的比较排序
- 对象的比较排序
- 对象之间比较的特殊
- java容器的排序
- java的容器排序
- 容器内对象的排序
- java 对象的排序 多字段比较 字符串排序
- Java对象之间的比较之equals和==
- 比较java c++ 对象之间的区别(内存)
- Java根据容器(List,ArrayList)内对象的字段排序
- Java关于实体对象和Map对象之间的转换
- ArrayList中的数据排序--java对象排序
- ArrayList中的数据排序--java对象排序
- ArrayList中的数据排序--java对象排序
- ArrayList中的数据排序--java对象排序
- ArrayList中的数据排序--java对象排序
- HDU
- SWIFT电文类型及格式
- JavaScript进阶之基础语法
- HDU1166
- Java必知必会及规范
- Java 关于对象之间的比较 , 容器中的数据的排序
- 滑动窗口的最大值-LintCode
- ckeditor实现照片上传功能
- Hibernate框架
- 垂直居中的方式
- 关于Mybatis框架的个人总结
- javascript获取文本框内的内容
- 9-23 数据库内容学习
- Java输入输出