十三、实现Comparable接口和new ComparatorT(){ }排序的实现过程

参考:https://www.cnblogs.com/igoodful/p/9517784.html


 

Collections有两种比较规则方式,第一种是使用自身的比较规则:

该类必须实现Comparable接口并重写comparTo方法。

this可以想象为1,传入对象o想象为2,返回1-2即按升序排序。返回2-1即按降序排序。

1、首先编写一个实现Comparable接口的实体类

 1 package com.abc;
 2 //Comparable接口后面一定要加上需要比较的数据类型
 3 public class Person implements Comparable<Person>{
 4 
 5     private String name;
 6     private int age;
 7     private int salary;
 8 
 9     public Person() {
10     }
11 
12     public Person(String name, int age, int salary) {
13         this.name = name;
14         this.age = age;
15         this.salary = salary;
16     }
17 
18     public String getName() {
19         return name;
20     }
21 
22     public void setName(String name) {
23         this.name = name;
24     }
25 
26     public int getAge() {
27         return age;
28     }
29 
30     public void setAge(int age) {
31         this.age = age;
32     }
33 
34     public int getSalary() {
35         return salary;
36     }
37 
38     public void setSalary(int salary) {
39         this.salary = salary;
40     }
41 
42     @Override
43     public String toString() {
44         return "Person{" +
45                 "name='" + name + '\'' +
46                 ", age=" + age +
47                 ", salary=" + salary +
48                 '}';
49     }
50 
51     //自身定义年龄升序
52     @Override
53     public int compareTo(Person o) {
54         return this.age-o.age;
55     }
56 }

 2、编写测试代码

package com.abc;import java.util.ArrayList;
import java.util.Collections;
import java.util.List;public class PersonTest {public static void main(String[] args){List<Person> people = new ArrayList<>();people.add(new Person("AAA",20,100));people.add(new Person("BBB",18,109));people.add(new Person("CCC",30,58));System.out.println(people);Collections.sort(people);System.out.println(people);}
}

3、运行结果

[Person{name='AAA', age=20, salary=100}, Person{name='BBB', age=18, salary=109}, Person{name='CCC', age=30, salary=58}]
//完成了年龄的升序排列 [Person{name='BBB', age=18, salary=109}, Person{name='AAA', age=20, salary=100}, Person{name='CCC', age=30, salary=58}]

 

 


 

第二个参数为比较器,可以使用它来定义针对集合排序时的比较元素大小的规则。

使用这种方式时,sort方法不要求集合元素必须实现Comparable接口了,因为不会使用元素自身的比较规则

1、编写一个普通的实体类,不需要实现任何接口

package com.abcd;public class Person{private String name;private int age;private int salary;public Person() {}public Person(String name, int age, int salary) {this.name = name;this.age = age;this.salary = salary;}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 int getSalary() {return salary;}public void setSalary(int salary) {this.salary = salary;}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +", salary=" + salary +'}';}}

2、编写测试代码

package com.abcd;import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;public class PersonTest {public static void main(String[] args){List<Person> people = new ArrayList<>();people.add(new Person("AAA",20,100));people.add(new Person("BBB",18,109));people.add(new Person("CCC",30,58));System.out.println(people);
     //排序规则 salary降序Collections.sort(people, new Comparator<Person>() {@Overridepublic int compare(Person o1, Person o2) {return o2.getSalary()- o1.getSalary();}});System.out.println(people);} }

3、运行结果

[Person{name='AAA', age=20, salary=100}, Person{name='BBB', age=18, salary=109}, Person{name='CCC', age=30, salary=58}]
[Person{name='BBB', age=18, salary=109}, Person{name='AAA', age=20, salary=100}, Person{name='CCC', age=30, salary=58}]

  

总结

总结一下,两种比较器Comparable和Comparator,后者相比前者有如下优点:

1、如果实现类没有实现Comparable接口,又想对两个类进行比较(或者实现类实现了Comparable接口,但是对compareTo方法内的比较算法不满意),那么可以实现Comparator接口,自定义一个比较器,写比较算法

2、实现Comparable接口的方式比实现Comparator接口的耦合性 要强一些,如果要修改比较算法,要修改Comparable接口的实现类,而实现Comparator的类是在外部进行比较的,不需要对实现类有任何修 改。从这个角度说,其实有些不太好,尤其在我们将实现类的.class文件打成一个.jar文件提供给开发者使用的时候。实际上实现Comparator 接口的方式后面会写到就是一种典型的策略模式

当然,这不是鼓励用Comparator,意思是开发者还是要在具体场景下选择最合适的那种比较器而已。

 

转载于:https://www.cnblogs.com/mason117/p/10646382.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/462967.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Presto入门介绍

最近在调研presto查询引擎的模块&#xff0c;先了解了下大体的框架和基本知识。这篇文章适合入门的童鞋看&#xff0c;因此转载了&#xff0c;用于以后查询使用。 1&#xff0c; Presto基本认识 1.1 定义 Presto是一个分布式的查询引擎&#xff0c;本身并不存储数据&#xff…

职场有影帝出没,屌丝们请当心!

引子职场有影帝出没&#xff0c;请当心&#xff01;广大屌丝请注意危险&#xff0c;谨慎前往。人生苦短&#xff0c;必须性感&#xff1b;职场如戏&#xff0c;要靠演技。不少公司正变成秀场&#xff0c;影帝层出不穷&#xff0c;屌丝们的辛苦努力一不小心就成了影帝的嫁衣。影…

深度点评五种常见WiFi搭建方案

总结十年无线搭建经验&#xff0c;针对企业常见的五种办公室无线网络方案做个简要分析&#xff0c;各种方案有何优劣&#xff0c;又适用于那种类型的企业。方案一&#xff1a;仅路由器或AP覆盖简述&#xff1a;使用路由器或AP覆盖多个无线盲区&#xff0c;多个AP的部署实现整体…

项目开发经验谈之:项目到底谁说了算

项目开发经验谈&#xff1a;项目的到底谁说了算 前言&#xff1a;项目到底是为谁而做&#xff0c;一个项目的成功到底是怎么样在评价&#xff1a;是领导阶层肯定&#xff0c;还是客户满意&#xff1f; 系列文章链接 项目开发经验谈&#xff1a;如何成为出色的开发人员盲目的项目…

深入理解Presto

深入理解Presto 简介 Presto是一个facebook开源的分布式SQL查询引擎&#xff0c;适用于交互式分析查询&#xff0c;数据量支持GB到PB字节。presto的架构由关系型数据库的架构演化而来。presto之所以能在各个内存计算型数据库中脱颖而出&#xff0c;在于以下几点&#xff1a; …

实战演示 bacula 软件备份功能

原文地址&#xff1a;http://www.linuxde.net/2012/04/9734.html 一、实例演示bacula的完全备份功能 1&#xff0e;创建卷组 执行如下命令&#xff0c;连接到bacula控制端&#xff0c;执行备份恢复操作&#xff1a; [rootbaculaserver opt]#/opt/bacula/sbin/bconsole Connec…

设置VS2017背景图片

设置方法很简单&#xff1a;安装扩展ClaudiaIDE 1、在这里下载扩展&#xff0c;https://visualstudiogallery.msdn.microsoft.com/9ba50f8d-f30c-4e33-ab19-bfd9f56eb817 2、然后双击即可完成安装。 之后重启VS&#xff0c;就可以看到编程背景上多了一个萌妹子&#xff0c;据说…

证书的应用之一 —— TCPSSL通信实例及协议分析(上)

SSL(Security Socket Layer)是TLS(Transport Layer Security)的前身&#xff0c;是一种加解密协议&#xff0c;它提供了再网络上的安全传输&#xff0c;它介于网络通信协议的传输层与应用层之间。 为实现TCP层之上的ssl通信&#xff0c;需要用到数字证书。本文通过具体例子来说…

自旋锁和互斥锁的区别

自旋锁和互斥锁的区别 POSIX threads(简称Pthreads)是在多核平台上进行并行编程的一套API。线程同步是并行编程中非常重要的通讯手段&#xff0c;其中最典型的应用就是用 Pthreads提供的锁机制(lock)来对多个线程之间的共享临界区(Critical Section)进行保护(另一种常用的同步…

校内模拟赛 Zbq's Music Challenge

Zbqs Music Challenge 题意&#xff1a; 一个长度为n的序列&#xff0c;每个位置可能是1或者0&#xff0c;1的概率是$p_i$。对于一个序列$S$&#xff0c;它的得分是 $$BasicScoreA\times \sum_{i1}^{n}{S_i} \tag{1}$$ $$ combo(i)\left\{ \begin{aligned} &S_i & &…

TSQL中实现ORACLE的多列IN 多列匹配。

期望效果&#xff1a;&#xff08;我是拿到一对关系去另一表中的一对关系去对比&#xff09;select * From Empoylee Where (Address1,Address2) in (Select Address1,Address2 From EmpoyleeAdresses Where Country Canada)以上无法实现用这种方案也可以实现 不过速度很慢的s…

ClickedOnce部署方法

1.ClickedOnce部署时有些DLL和配置文件无法自动部署到系统当中&#xff0c;只能用Manifest Manager Tool 修改manifest 文件 /Files/Tonyyang/Software/ManifestManagerUtility.rar 2.部署文件结构 3.部署方法 首先用VS自带的ClickedOnce发布应用程序&#xff08;博客园有&…

自旋锁/互斥锁/读写锁/递归锁的区别与联系

自旋锁 互斥锁 读写锁 递归锁 互斥锁(mutexlock)&#xff1a; 最常使用于线程同步的锁&#xff1b;标记用来保证在任一时刻&#xff0c;只能有一个线程访问该对象&#xff0c;同一线程多次加锁操作会造成死锁&#xff1b;临界区和互斥量都可用来实现此锁&#xff0c;通常情况下…

树莓派安装MySQL数据库与卸载

出处&#xff1a; 1、http://www.cnblogs.com/liyangLife/p/4500115.html 2、https://blog.csdn.net/huayucong/article/details/49736427 3、https://www.imooc.com/article/23132?block_idtuijian_wz 4、http://www.runoob.com/mysql/mysql-install.html&#xff08;Debian系…

关于selectNodes与selectSingleNode的用法的区别

今天在网上看到一个关于selectNodes与selectSingleNode的用法的区别。 由于之前没有特别在意&#xff0c;因而今日看见是很是惊异。特复制过来&#xff0c;供大家一起学习&#xff01; 其中文中提到了最重要的区别是在运用操作后的变化。 selectnodes: selectNodes和ChildNo…

第七章 数组

7.1、数组概述 7.1.1、为什么需要数组 答&#xff1a;有时候需要存储或处理一系列数据&#xff0c;数组就可以充当这样的角色&#xff0c;它在内存中是相连的数据&#xff0c;并且在栈中的引用只有一个&#xff0c; 如果不用数组&#xff0c;那数据就得一个一个定义一个一个声明…

notify_one() 或 notify_all() 在c++中的使用要点

notify_one() 或 notify_all() 如果在锁(mutex spin_lock)里调用&#xff0c;可能会导致被立刻唤醒的线程继续阻塞&#xff0c;因为锁被notify线程持有。 c标准上说&#xff0c;一些实现(尤其是许多 pthread 的实现)为了归避这种情况&#xff0c;在通知调用中&#xff0c;直接将…

[转载]Asp.net MVC中Controller返回值类型

Asp.net MVC中Controller返回值类型在mvc中所有的controller类都必须使用"Controller"后缀来命名并且对Action也有一定的要求&#xff1a; 必须是一个public方法必须是实例方法没有标志NonActionAttribute特性的(NoAction)不能被重载必须返回ActionResult类型如: [cs…

Visual Studio.net 2010 Windows Service 开发,安装与调试

本示例完成一个每隔一分钟向C:\log.txt文件写入一条记录为例&#xff0c;讲述一个Windows Service 程序的开发,安装与调试 原程序&#xff0c;加文档示例下载 /Files/zycblog/SourceCode.rar 目录索引 1 开发工具 2 开发过程 3 安装 4 开发调试 5 注意事项 6 参考资料…

ArcGis dbf读写——挂接Excel到属性表 C#

ArcMap提供了挂接Excel表格信息到属性表的功能&#xff0c;但是当数据量较大到以万计甚至十万计的时候这个功能就歇菜了&#xff0c;当然&#xff0c;你可以考虑分段挂接。这个挂接功能只是做了一个表关联&#xff0c;属性记录每个字段的信息需要通过“字段计算器”计算过来。 …