Arrays 类中的sort方法承诺可以对对象数组进行排序,但是需要对象所属的类实现Comparable接口

任何实现Comparable接口的对象都需要实现该方法 并且在Java SE 5.0之前该方法的的参数必须是Object类型对象,返回一个整形数值 。在Java SE 5.0之后Comparable接口已经改进为泛型类型。

1 public interface Comparable<T> {
2 public int compareTo(T o);
3 }

对于compareTo()方法源码是这样写的:

  • int compareTo(T o)
    将此对象与指定的对象进行比较以进行排序。 返回一个负整数,零或正整数,因为该对象小于,等于或大于指定对象。

    实现程序必须确保sgn(x.compareTo(y)) == -sgn(y.compareTo(x))所有xy。 (这意味着x.compareTo(y)必须抛出异常iff y.compareTo(x)引发异常。)

    实施者还必须确保关系是可传递的: (x.compareTo(y)>0 && y.compareTo(z)>0)表示x.compareTo(z)>0

    最后,实施者必须确保x.compareTo(y)==0意味着sgn(x.compareTo(z)) == sgn(y.compareTo(z)) ,对于所有z

    强烈建议,但不要严格要求(x.compareTo(y)==0) == (x.equals(y)) 。 一般来说,任何实现Comparable接口并违反这种情况的类应清楚地表明这一点。 推荐的语言是“注意:此类具有与equals不一致的自然排序”。

    在前面的描述中,符号sgn( ) 表达式表示数学符号函数,其定义根据表达式的值是否为负,零或正返回的-1一个,0,1。

    参数
    o - 要比较的对象。
    结果
    负整数,零或正整数,因为该对象小于,等于或大于指定对象。
    异常
    NullPointerException - 如果指定的对象为空
    ClassCastException - 如果指定的对象的类型阻止它与该对象进行比较。 

实现代码:

 1 package test;
2
3 import java.util.Arrays;
4
5 public class Employee implements Comparable<Employee> {
6
7 int id;
8
9 String name;
10
11 double salary;
12
13 public Employee() {
14 }
15
16 public Employee(int id, String name, double salary) {
17 super();
18 this.id = id;
19 this.name = name;
20 this.salary = salary;
21 }
22
23 public int getId() {
24 return id;
25 }
26
27 public String getName() {
28 return this.name;
29 }
30
31 public double getSalary() {
32 return salary;
33 }
34
35 public void raiseSalary(double byPercent) {
36 double raise = salary * byPercent / 100;
37 salary += salary;
38
39 }
40
41 /*
42 * Arrays 类中的sort方法承诺可以对对象数组进行排序,但是需要对象所属的类实现Comparable接口
43 *
44 * 任何实现Comparable接口的对象都需要实现该方法 并且该方法的的参数必须是Object类型对象,返回一个整形数值
45 */
46 @Override
47 public int compareTo(Employee other) {
48
49 /*
50 * this.salary < other.salsry 返回 -1
51 * this.salary = other.salsry 返回 0
52 * this.salary > other.salsry 返回 1
53 */
54 return Double.compare(this.salary, other.salary);
55 }
56
57 @Override
58 public String toString() {
59 return "Employee [id=" + id + ", name=" + name + ", salary=" + salary + "]";
60 }
61
62 public static void main(String[] args) {
63 Employee[] staff = new Employee[3];
64
65 staff[0] = new Employee(1, "qijian", 15000.0);
66 staff[1] = new Employee(2, "Herry", 13000.0);
67 staff[2] = new Employee(3, "Tom", 14000.0);
68
69 Arrays.sort(staff);
70
71 for (Employee e : staff) {
72 System.out.println(e.toString());
73 }
74
75 }
76
77 }

结果:

注意:

  该接口对实现它的每个类的对象强加一个整体排序。 这个排序被称为类的自然排序 ,类的compareTo方法被称为其自然比较方法

利用Comparable接口实现对对象数组的排序的更多相关文章

  1. iOS开发之谓词Predicate和对象数组的排序

    我们在开发中经常使用的Predicate谓词,主要是正则表达式的使用,今天给大家简单的讲讲怎样去使用谓词. 因为内容比较简单,所以直接上代码展示: NSMutableArray *people_arr ...

  2. 对象数组自定义排序--System.Collections.ArrayList.Sort()

    使用System.Collections.ArrayList.Sort()对象数组自定义排序 其核心为比较器的实现,比较器为一个类,继承了IComparer接口并实现int IComparer.Com ...

  3. Java自定义排序:继承Comparable接口,重写compareTo方法(排序规则)

    代码: 1 import java.util.*; 2 3 /** 4 * 学习自定义排序:继承Comparable接口,重写compareTo方法(排序规则). 5 * TreeMap容器的Key是 ...

  4. PHP 根据对象属性进行对象数组的排序(usort($your_data, "cmp");)(inside the class: usort($your_data, array($this, "cmp")))

    PHP 根据对象属性进行对象数组的排序(usort($your_data, "cmp");)(inside the class: usort($your_data, array($ ...

  5. 【LeetCode】two num 利用comparable接口 对对象进行排序

    题目two num 题意:给定一个整数数组和一个目标值.要求在数组中找到两个数.使得它们的和相加等于目标值.而且返回两个数的下标 思路:1.假设使用暴力,时间复杂度为O(n^2) 2.能够先将全部数进 ...

  6. C#基础:通过委托给任何对象数组进行排序

    在日常编写程序的时候,我们需要对一些对象进行排序,比如对int数组进行排序,自定义类数组进行排序,首先我们先讨论对数组进行排序,我们应该对冒泡排序比较熟悉,下面是数组用冒泡排序的方法 for (int ...

  7. 微信小程序:利用map方法方便获得对象数组中的特定属性值们

  8. js通用对象数组冒牌排序

    数组对象通用 function sort(data, sortFiled, orderby) { var result = data, temp; for (var i = 0; i < res ...

  9. 实现Comparator接口和Comparable接口,以及Map按value排序 ,map遍历

    继承Comparator接口,重写compare()方法 import java.util.ArrayList; import java.util.Arrays; import java.util.C ...

随机推荐

  1. 1. 揭秘Spring类型转换 - 框架设计的基石

    仰不愧天,俯不愧人,内不愧心.关注公众号[BAT的乌托邦],有Spring技术栈.MyBatis.JVM.中间件等小而美的原创专栏供以免费学习.分享.成长,拒绝浅尝辄止.本文已被 https://ww ...

  2. linq 查询的结果会开辟新的内存吗?

    一:背景 1. 讲故事 昨天群里有位朋友问:linq 查询的结果会开辟新的内存吗?如果开了,那是对原序列集里面元素的深拷贝还是仅仅拷贝其引用? 其实这个问题我觉得问的挺好,很多初学 C# 的朋友或多或 ...

  3. 【GDKOI2014】JZOJ2020年8月13日提高组T1 阶乘

    [GDKOI2014]JZOJ2020年8月13日提高组T1 阶乘 题目 Description Input 第一行有一个正整数T,表示测试数据的组数. 接下来的T行,每行输入两个十进制整数n和bas ...

  4. 解决 Zuul 中 OAuth2 报 unauthorized 错误

    问题描述 微服务中使用 OAuth2 鉴权,直接访问正常,通过 Zuul 访问报错: { "error": "unauthorized", "erro ...

  5. 网络编程原理与UDP实现

    如何发送数据包? Q:当应用程序产生数据的时候,需要去构造数据包并发送到网络上去,但是由谁负责处理呢? A:现代操作系统负责数据包得构造与发送,应用程序只需提供数据. 当应用程序产生数据时,应用程序将 ...

  6. 数据库原理-事务隔离与多版本并发控制(MVCC)

    刚来美团实习,正好是星期天,不得不说,其内部的资料很丰富,看了部分文档后,对数据库事务这块更理解了.数据库事务的ACID,大家都知道,为了维护这些性质,主要是隔离性和一致性,一般使用加锁这种方式.同时 ...

  7. java并发编程实战《八》管程

    管程:并发编程的万能钥匙 为什么 Java 在 1.5 之前仅仅提供了 synchronized 关键字及 wait().notify().notifyAll() 这三个看似从天而降的方法? Java ...

  8. PyQt学习随笔:Model/View架构中多个视图之间选择数据项同步

    我们知道多个视图之间通过使用相同的model就可以实现数据的共享(具体请参考< PyQt学习随笔:ListView控件的视图和数据模型分离案例>),除了数据的共享之外,多个视图之间还可以同 ...

  9. PyQt(Python+Qt)学习随笔:Qt中的部分类型QString、QList和指针、引用在PyQt中的实现方式

    老猿Python博文目录 老猿Python博客地址 在我们查阅Qt的文档资料时,可以看到Qt中的链表使用的是QList,字符串使用的是QString,但老猿在测试时发现这两个类型PyQt不支持,无法找 ...

  10. 在IDEA上 使用maven进行打包时报错: Failed to execute goal org.apache.maven.plugins:maven-javadoc-plugin:2.10.2:jar

    报错内容: Failed to execute goal org.apache.maven.plugins:maven-javadoc-plugin:2.10.2:jar (attach-javado ...