1、一个类在设计之初就要实现对该类对象的排序功能,那么这个类要实现Comparable接口,实现public int compareTo(T t)方法。如代码中的Student类。
对于实现Comparable接口的类,

调用java.util.Arrays.sort(Object[] a)对包含对象实例的数组进行排序,

调用java.util.Collections.sort(List<T> list)对包含对象实例的list进行排序。

2、若一个类在设计之初并没有对排序功能的需求,而是在后续的使用中想要对这个类添加排序的功能,如Teacher类。这时的办法是实现一个比较器类,
如TeacherComparator类,实现public int compare(T t1, T t2)让该类实现Comparator接口。

调用java.util.Arrays.sort(T[] a, Comparator<? super T> c) 对包含对象实例的数组进行排序,
调用java.util.Collections.sort(List<T> list, Comparator<? super T> c) 对包含对象实例的list进行排序。

3、a.compareTo(b)方法和compare(a,b)方法,在方法中判断两个对象的某个或某些属性的大小关系,若a的某个属性比b的属性小,返回负整数,若相等,返回0,否则返回正整数。

if a.attr < b.attr

return -1 

else 

return 1

上面即为按照某属性从小到大排序。

if a.attr < b.attr

return 1 

else 

return -1

上面为按照某属性从大到小排序。

以下代码按照Score从高到底排序,若Score相同,则按照age从小到大排序。

public class Student implements Comparable<Student>{

    private String name;
private int id;
private int score;
private int age; public Student(String name, int id, int score, int age) {
super();
this.name = name;
this.id = id;
this.score = score;
this.age = age;
} @Override
public int compareTo(Student s) {
if (this.score < s.getScore()) {
return 1;
} else if (this.score > s.getScore()) {
return -1;
} else {
if (this.age < s.getAge()) {
return -1;
} else {
return 1;
}
}
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public int getScore() {
return score;
} public void setScore(int score) {
this.score = score;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public static void main(String[] args) { System.out.println("use Interface Comparable");
System.out.println(); System.out.println("Array ");
System.out.println(); Student[] stu = {new Student("a", 1, 88, 18),
new Student("b", 2, 78, 16),
new Student("c", 3, 88, 17),
new Student("d", 4, 78, 16),
new Student("e", 5, 100, 18)}; Arrays.sort(stu);
for (Student s : stu) {
System.out.println(s.getScore() + " " + s.getAge());
} System.out.println("***");
System.out.println("List");
System.out.println(); List<Student> list = new ArrayList<Student>();
list.add(new Student("a", 1, 88, 18));
list.add(new Student("b", 2, 78, 16));
list.add(new Student("c", 3, 88, 17));
list.add(new Student("d", 4, 78, 16));
list.add(new Student("e", 5, 100, 18));
Collections.sort(list);
for (Student s : list) {
System.out.println(s.getScore() + " " + s.getAge());
}
System.out.println();
System.out.println("use Interface Comparator");
System.out.println();
System.out.println("Array");
System.out.println(); Teacher[] teach = {
new Teacher("a", 1, 88, 18),
new Teacher("b", 2, 78, 16),
new Teacher("c", 3, 88, 17),
new Teacher("d", 4, 78, 16),
new Teacher("e", 5, 100, 18)};
Arrays.sort(teach, new TeacherComparator());
for (Teacher t : teach) {
System.out.println(t.getScore() + " " + t.getAge());
} System.out.println();
System.out.println("List");
System.out.println(); List<Teacher> tList = new ArrayList<Teacher>();
tList.add(new Teacher("a", 1, 88, 18));
tList.add(new Teacher("b", 2, 78, 16));
tList.add(new Teacher("c", 3, 88, 17));
tList.add(new Teacher("d", 4, 78, 16));
tList.add(new Teacher("e", 5, 100, 18));
Collections.sort(tList, new TeacherComparator());
for (Teacher t : tList) {
System.out.println(t.getScore() + " " + t.getAge());
}
}
} class Teacher { private String name;
private int id;
private int score;
private int age; public Teacher(String name, int id, int score, int age) {
super();
this.name = name;
this.id = id;
this.score = score;
this.age = age;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public int getScore() {
return score;
} public void setScore(int score) {
this.score = score;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
}
} class TeacherComparator implements Comparator<Teacher> { @Override
public int compare(Teacher t1, Teacher t2) { if (t1.getScore() < t2.getScore()) {
return 1;
} else if (t1.getScore() > t2.getScore()) {
return -1;
} else {
if (t1.getAge() < t2.getAge()) {
return -1;
} else {
return 1;
}
}
} }

Comparable接口和Comparator接口的更多相关文章

  1. Java中实现对象的比较:Comparable接口和Comparator接口

    在实际应用中,我们往往有需要比较两个自定义对象大小的地方.而这些自定义对象的比较,就不像简单的整型数据那么简单,它们往往包含有许多的属性,我们一般都是根据这些属性对自定义对象进行比较的.所以Java中 ...

  2. Java6.0中Comparable接口与Comparator接口详解

    Java6.0中Comparable接口与Comparator接口详解 说到现在,读者应该对Comparable接口有了大概的了解,但是为什么又要有一个Comparator接口呢?难道Java的开发者 ...

  3. Java:实现对象的比较 comparable接口和comparator接口

    在实际应用中,我们往往有需要比较两个自定义对象大小的地方.而这些自定义对象的比较,就不像简单的整型数据那么简单,它们往往包含有许多的属性,我们一般都是根据这些属性对自定义对象进行比较的.所以Java中 ...

  4. Java—集合框架 Collections.sort()、Comparable接口和Comparator接口

    Collentions工具类--java.util.Collections Collentions是Java集合框架中,用来操作集合对象的工具类,也是Java集合框架的成员,与List.Map和Set ...

  5. Comparable接口与Comparator接口的比较————总结

    之前的两篇文章主要学习了Comparable接口和Comparator接口的学习.既然已经学习完了,现在就趁热打铁,进行总结吧! Comparable接口和Comparator接口的共同点: 1. 都 ...

  6. 比较器:Compare接口与Comparator接口区别与理解

    一.实现Compare接口与Comparator接口的类,都是为了对象实例数组排序的方便,因为可以直接调用 java.util.Arrays.sort(对象数组名称),可以自定义排序规则. 不同之处: ...

  7. java中Comparatable接口和Comparator接口的区别

    1.不同类型的排序规则 .自然排序是什么?   自然排序是一种升序排序.对于不同的数据类型,升序规则不一样:   BigDecimal BigInteger Byte Double Float Int ...

  8. Comparatable接口和Comparator接口的使用与区别

    这篇博文可以为你解决的问题如下: 什么是自然排序 Collections.sort()与Arrays.sort()的异同点 Comparatable接口和Comparator接口各自的排序依据(理论讲 ...

  9. Java中的Comparable接口和Comparator接口

    Comparator位于包java.util下,比较器,是在集合外部定义排序.Comparable位于包java.lang下,代表当前对象可比较的,是在集合内部实现排序. Comparable代表一个 ...

  10. Java之Comparable接口和Comparator接口

    Comparable & Comparator 都是用来实现集合中元素的比较.排序的: Comparable 是在集合内部定义的方法实现的排序: Comparator 是在集合外部实现的排序: ...

随机推荐

  1. 微软依赖注入Unity

    Unity是一个依赖注入(Dependency Injection,DI)容器.DI的标准描述文章来自Martin Flower[0].作为一个快速的摘要,依赖注入容器就是一个用于构建高度松耦合的软件 ...

  2. 常用UI模板,loading框,提醒框,弹框确认框

    css部分 #public_box{width:100%;height:100%;position:fixed;top:0;left:0;z-index:100;background:rgba(0,0 ...

  3. Java并发系列[7]----CountDownLatch源码分析

    CountDownLatch(闭锁)是一个很有用的工具类,利用它我们可以拦截一个或多个线程使其在某个条件成熟后再执行.它的内部提供了一个计数器,在构造闭锁时必须指定计数器的初始值,且计数器的初始值必须 ...

  4. BFS-九宫格重排(详解)

    BFS将近两年没练过题了,今天重新回忆下以前刷的蓝桥杯题:九宫格重排 样例输入  //初始状态 //终点状态 样例输出  //最短步数 样例输入  //初始状态 //终点状态 样例输出  //最短步数 ...

  5. 启动就加载(一)----注解方式实现的。static项目启动的时候就加载进来(一般用于常用参数)

    一,案例 1.1,图片分析 1.2,代码 1.2.1,编写加载系统参数的servlet public class SysInitServlet extends HttpServlet { public ...

  6. C# 图解教程 第二章 C#编程概述

    C#编程概述 一个简单的C#程序标识符关键字Main:程序的起始点从程序输出文本注释 C#编程概述 一个简单的C#程序 标识符 标识符是一种字符串,用来命名变量.方法.参数和许多后面将要阐述的其他程序 ...

  7. CSS布局方案

    居中布局 水平居中 1)使用inline-block+text-align 原理:先将子框由块级元素改变为行内块元素,再通过设置行内块元素居中以达到水平居中. 用法:对子框设置display:inli ...

  8. SpringMVC 框架系列之组件概述与配置详解

    在上一篇文章 SpringMVC 框架系列之初识与入门实例 的实例中,我们已经知道,SpringMVC 框架是一个 web 层的框架,本篇文章就详细解释一下 SpringMVC 框架具体文件的配置以及 ...

  9. 【BZOJ2006】超级钢琴(主席树,优先队列)

    [BZOJ2006]超级钢琴(主席树,优先队列) 题面 BZOJ 题解 既然是一段区间 首先就要变成单点 所以求一个前缀和 这个时候贪心很明显了: 枚举每一个点和可以和它组成一段的可行的点 全部丢进一 ...

  10. [BZOJ1212][HNOI2004]L语言

    BZOJ Luogu sol 设\(f_i\)表示文章的前\(i\)个字符是否可以被理解.每次匹配要暴跳\(fail\)到根,转移就是\(f_i|=f_{i-len}\),其中\(len\)是某个可以 ...