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. python学习之字典(Dictionary)练习

    Python字典是另一种可变容器模型,且可存储任意类型对象,如字符串.数字.元组等其他容器模型 字典中分为键值对 , key 类型需要时被哈希. value 类型可以是 字符串.数字.元组等其他容器模 ...

  2. pat1071-1080

    1071 #include<iostream> #include<cstdio> #include<cstring> #include<vector> ...

  3. iOS - EaseMob 环信的使用

    1.环信 环信使用的是 XMPP 协议,它是在 XMPP 的基础上进行的二次开发,对服务器 Openfire 和客户端进行功能模型的添加和客户端 SDK 的封装.环信的本质还是使用 XMPP,基于 S ...

  4. 浅谈js中null和undefined的区别

    在JS中,null和undefined是经常让人摸不着头脑的东西,尤其是在数据初始化以及处理的过程中,经常稍微不注意,就会让页面在渲染时出现报错,下面来细说下,这两者之间的区别: null 表示一个对 ...

  5. linux shell 基本规范

    开头指定脚本解释器 #!/bin/bash 或 #!/bin/sh 开头加版权信息 #Date: 2017-8-01 22:50 #Author: yang qiang wei #Mail: xxx@ ...

  6. 使用PHPword中文乱码并且下载的方法

    如果你的编码格式是utf-8的话就用这个 1.找到 Section.php 的 addText 函数 $givenText = utf8_encode($text); 改成 $givenText = ...

  7. 【BZOJ2127】happiness(最小割)

    [BZOJ2127]happiness(最小割) 题面 Description 高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友.这学期要分文理科了, ...

  8. luogu2402 奶牛隐藏

    题目描述 在一个农场里有n块田地.某天下午,有一群牛在田地里吃草,他们分散在农场的诸多田地上,农场由m条无向的路连接,每条路有不同的长度. 突然,天降大雨,奶牛们非常混乱,想要快点去躲雨.已知每个田地 ...

  9. Django的models实现分析

    1      引子 1.1     神奇的Django中的models 我们先来看一段在Django项目中常用的代码: 设置数据库models代码: class Students(models.Mod ...

  10. 手摸手教你微信小程序开发之自定义组件

    前言 相信大家在开发小程序时会遇到某个功能多次使用的情况,比如弹出框.这个时候大家首先想到的是组件化开发,就是把弹出框封装成一个组件,然后哪里使用哪里就调用,对,看来大家都是有思路的人,但是要怎样实现 ...