Java中Comparator和Comparable之间的区别

常见的面试问题之一是“比较器和可比较器之间有什么区别”。 或“您将如何通过其ID或名称对员工对象集合进行排序”。为此,我们可以使用两个接口,即Comparator和Comparable。在我们真正看到差异之前,让我简要介绍一下两者。


可比接口:要对其进行排序的对象的类必须实现此接口。在此,我们必须实现compareTo(Object)方法。

例如:

public class Country implements Comparable{@Overridepublic int compareTo(Object arg0) {Country country=(Country) arg0;return (this.countryId < country.countryId ) ? -1: (this.countryId > country.countryId ) ? 1:0 ;
}}

如果任何类实现可比较的接口,则可以使用Collection.sort()或Arrays.sort()自动对该对象的集合进行排序。对象将基于该类中的compareTo方法进行排序。

在Java中实现Comparable的对象可以用作SortedMap(如TreeMap)或SortedSet(如TreeSet)中的键,而无需实现任何其他接口。

Comparator接口:需要对其进行排序的对象的类无需实现此接口。某些第三类可以实现此接口进行排序。egCountrySortByIdComparator类可以实现Comparator接口以按ID对国家对象的集合进行排序。 例如:

public class CountrySortByIdComparator implements Comparator<Country>{@Overridepublic int compare(Country country1, Country country2) {return (country1.getCountryId() < country2.getCountryId() ) ? -1: (country1.getCountryId() > country2.getCountryId() ) ? 1:0 ;}}

使用Comparator界面,我们可以根据要排序的对象的不同属性编写不同的排序。您可以使用匿名比较器在特定代码行进行比较。 例如:

Country indiaCountry=new Country(1, 'India');Country chinaCountry=new Country(4, 'China');Country nepalCountry=new Country(3, 'Nepal');Country bhutanCountry=new Country(2, 'Bhutan');List<Country> listOfCountries = new ArrayList<Country>();listOfCountries.add(indiaCountry);listOfCountries.add(chinaCountry);listOfCountries.add(nepalCountry);listOfCountries.add(bhutanCountry); //Sort by countryNameCollections.sort(listOfCountries,new Comparator<Country>() {@Overridepublic int compare(Country o1, Country o2) {return o1.getCountryName().compareTo(o2.getCountryName());}});

比较器vs可比

参数 可比 比较器
排序逻辑 排序逻辑必须在要对其对象进行排序的同一类中。 因此,这称为对象的自然排序 排序逻辑在单独的类中。 因此,我们可以根据要排序的对象的不同属性编写不同的排序。 例如,使用ID,名称等进行排序
实作 对其对象进行排序的类必须实现此接口。例如Country类需要实现与id对应的country对象的收集类似的实现 要排序对象的类不需要实现此接口。其他一些类也可以实现此接口。 Eg-CountrySortByIdComparator类可以实现Comparator接口,以按ID对国家/地区对象的集合进行排序

排序方式
int compareTo(Object o1)
该方法将该对象与o1对象进行比较并返回一个整数,其值具有以下含义
1.正数–该对象大于o1 2.零–此对象等于o1 3.负数–该对象小于o1
int compare(对象o1,对象o2)
此方法比较o1和o2对象。 并返回一个整数。其值具有以下含义。 1.正数– o1大于o2 2.零– o1等于o2 3.负数– o1小于o1
调用方式 Collections.sort(列表)
在这里,对象将根据CompareTo方法进行排序
Collections.sort(列表,比较器)
在这里,对象将根据Comparator中的Compare方法进行排序
Java.lang.Comparable

Java.util.Comparator

Java代码:
对于Comparable:我们将创建具有属性ID和名称的country类,该类将实现Comparable接口并实现CompareTo方法以按ID对国家对象的集合进行排序。

1. Country.java

package org.arpit.javapostsforlearning;
//If this.cuntryId < country.countryId:then compare method will return -1
//If this.countryId > country.countryId:then compare method will return 1
//If this.countryId==country.countryId:then compare method will return 0
public class Country implements Comparable{int countryId;String countryName;public Country(int countryId, String countryName) {super();this.countryId = countryId;this.countryName = countryName;}@Overridepublic int compareTo(Object arg0) {Country country=(Country) arg0;return (this.countryId < country.countryId ) ? -1: (this.countryId > country.countryId ) ? 1:0 ;}public int getCountryId() {return countryId;}public void setCountryId(int countryId) {this.countryId = countryId;}public String getCountryName() {return countryName;}public void setCountryName(String countryName) {this.countryName = countryName;}}

2.ComparatorMain.java

package org.arpit.javapostsforlearning;import java.util.ArrayList;
import java.util.Collections;
import java.util.List;public class ComparatorMain {/*** @author Arpit Mandliya*/public static void main(String[] args) {Country indiaCountry=new Country(1, 'India');Country chinaCountry=new Country(4, 'China');Country nepalCountry=new Country(3, 'Nepal');Country bhutanCountry=new Country(2, 'Bhutan');List<Country> listOfCountries = new ArrayList<Country>();listOfCountries.add(indiaCountry);listOfCountries.add(chinaCountry);listOfCountries.add(nepalCountry);listOfCountries.add(bhutanCountry);System.out.println('Before Sort  : ');for (int i = 0; i < listOfCountries.size(); i++) {Country country=(Country) listOfCountries.get(i);System.out.println('Country Id: '+country.getCountryId()+'||'+'Country name: '+country.getCountryName());}Collections.sort(listOfCountries);System.out.println('After Sort  : ');for (int i = 0; i < listOfCountries.size(); i++) {Country country=(Country) listOfCountries.get(i);System.out.println('Country Id: '+country.getCountryId()+'|| '+'Country name: '+country.getCountryName());}}}

输出:

Before Sort  : 
Country Id: 1||Country name: India
Country Id: 4||Country name: China
Country Id: 3||Country name: Nepal
Country Id: 2||Country name: Bhutan
After Sort  : 
Country Id: 1|| Country name: India
Country Id: 2|| Country name: Bhutan
Country Id: 3|| Country name: Nepal
Country Id: 4|| Country name: China

对于Comparator:我们将创建具有属性ID和名称的country类,并创建另一个CountryAortByIdComparator类,该类将实现Comparator接口并实现compare方法以按ID对国家对象的集合进行排序,并且还将看到如何使用匿名比较器。

1.国家/地区

package org.arpit.javapostsforlearning;public class Country{int countryId;String countryName;public Country(int countryId, String countryName) {super();this.countryId = countryId;this.countryName = countryName;}public int getCountryId() {return countryId;}public void setCountryId(int countryId) {this.countryId = countryId;}public String getCountryName() {return countryName;}public void setCountryName(String countryName) {this.countryName = countryName;}}

2.CountrySortbyIdComparator.java

package org.arpit.javapostsforlearning;import java.util.Comparator;
//If country1.getCountryId()<country2.getCountryId():then compare method will return -1
//If country1.getCountryId()>country2.getCountryId():then compare method will return 1
//If country1.getCountryId()==country2.getCountryId():then compare method will return 0public class CountrySortByIdComparator implements Comparator<Country>{@Overridepublic int compare(Country country1, Country country2) {return (country1.getCountryId() < country2.getCountryId() ) ? -1: (country1.getCountryId() > country2.getCountryId() ) ? 1:0 ;}}

3,ComparatorMain.java

package org.arpit.javapostsforlearning;import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;public class ComparatorMain {/*** @author Arpit Mandliya*/public static void main(String[] args) {Country indiaCountry=new Country(1, 'India');Country chinaCountry=new Country(4, 'China');Country nepalCountry=new Country(3, 'Nepal');Country bhutanCountry=new Country(2, 'Bhutan');List<Country> listOfCountries = new ArrayList<Country>();listOfCountries.add(indiaCountry);listOfCountries.add(chinaCountry);listOfCountries.add(nepalCountry);listOfCountries.add(bhutanCountry);System.out.println('Before Sort by id : ');for (int i = 0; i < listOfCountries.size(); i++) {Country country=(Country) listOfCountries.get(i);System.out.println('Country Id: '+country.getCountryId()+'||'+'Country name: '+country.getCountryName());}Collections.sort(listOfCountries,new CountrySortByIdComparator());System.out.println('After Sort by id: ');for (int i = 0; i < listOfCountries.size(); i++) {Country country=(Country) listOfCountries.get(i);System.out.println('Country Id: '+country.getCountryId()+'|| '+'Country name: '+country.getCountryName());}//Sort by countryNameCollections.sort(listOfCountries,new Comparator<Country>() {@Overridepublic int compare(Country o1, Country o2) {return o1.getCountryName().compareTo(o2.getCountryName());}});System.out.println('After Sort by name: ');for (int i = 0; i < listOfCountries.size(); i++) {Country country=(Country) listOfCountries.get(i);System.out.println('Country Id: '+country.getCountryId()+'|| '+'Country name: '+country.getCountryName());}}}

输出:

Before Sort by id : 
Country Id: 1||Country name: India
Country Id: 4||Country name: China
Country Id: 3||Country name: Nepal
Country Id: 2||Country name: Bhutan
After Sort by id: 
Country Id: 1|| Country name: India
Country Id: 2|| Country name: Bhutan
Country Id: 3|| Country name: Nepal
Country Id: 4|| Country name: China
After Sort by name: 
Country Id: 2|| Country name: Bhutan
Country Id: 4|| Country name: China
Country Id: 1|| Country name: India
Country Id: 3|| Country name: Nepal

参考: JCG合作伙伴 Arpit Mandliya在Java框架和面向初学者博客的设计模式中的 比较器与Java中的Comparable之间的区别 。

翻译自: https://www.javacodegeeks.com/2013/03/difference-between-comparator-and-comparable-in-java.html

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

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

相关文章

bzoj2375 疯狂的涂色

疯狂的涂色 Time Limit: 5 Sec Memory Limit: 128 MB Description 小t非常喜爱画画&#xff0c;但是他还是一个初学者。他最近费尽千辛万苦才拜到已仙逝的达芬奇为师&#xff08;神仙&#xff1f;妖怪&#xff1f;谢谢&#xff09;。达芬奇果然是画鸡蛋长大的&#xff0c;让小t…

人工通道会取消吗_二七政策将用于ETC?高速或将取消人工收费通道

随着社会的发展&#xff0c;有车一族越来越多&#xff0c;但是在这种情况下&#xff0c;堵车的情况就随处可见了&#xff0c;并且随着车辆的增多&#xff0c;高速收费通道的成本也增加了不少&#xff0c;而且通过时间越来越长&#xff0c;面对这种情况&#xff0c;交通局就和银…

零基础的前端开发初学者应如何系统地学习?

网站开发开发大致分为前端和后端&#xff0c;前端主要负责实现视觉和交互效果&#xff0c;以及与服务器通信&#xff0c;完成业务逻辑。其核心价值在于对用户体验的追求。可以按如下思路学习系统学习&#xff1a; 基础知识&#xff1a; html css 这部分建议在 w3school 在线教…

《大道至简》第一章读后感(java伪代码形式编写)

public class DaDaoZhiJianDiYiDuan { //一.愚公移山 //问题&#xff1a;怎样把山移完 //愚公移山是一个项目 if(愚公死) { 有子存焉&#xff1b; while&#xff08;山不平&#xff09; { 子又生孙&#xff0c;孙又生子&#xff1b; 子去移山&#xff1b; } } else 愚公移山&am…

在Oracle Cloud上的Prime-UI,JAX-RS和Jersey和Gson

如今&#xff0c;Oracle云无处不在。 最初&#xff0c;拉里&#xff08;Larry&#xff09;否认在很长一段时间内都需要云&#xff0c;并且在去年的开放世界&#xff08;Open World&#xff09;之后就宣布了一些非常早期的公告&#xff0c;而且可用性很差&#xff0c;似乎没有人…

【RabbitMQ】2、心得总结,资料汇总

Spring AMQP中文文档 http://ju.outofmemory.cn/entry/320538 云栖社区 https://yq.aliyun.com/search?qrabbitmq&typeARTICLE RabbitMQ-JAVA常见报错信息 &#xff0c; https://yq.aliyun.com/articles/175024CentOS7环境下安装RabbitMQ&#xff0c; http://t.cn/RCtr…

推荐20个很有帮助的 Web 前端开发教程

在平常的搜索中&#xff0c;我碰到过很多有趣的信息&#xff0c;应用程序和文档&#xff0c;我把它们整理在下面这个列表。这是收藏的遇到的有用内容的一个伟大的方式&#xff0c;可以在你需要的时候方便查阅。相信你会在这个列表中发现对你很有用的资料。 1. CSS Vocabulary 一…

Scrapy爬虫框架解析

Scrapy框架解析Scrapy框架大致包括以下几个组件&#xff1a;Scrapy Engine、Spiders、Scheduler、Item Pipeline、Downloader&#xff1b;组件Scrapy Engine这是框架的核心&#xff0c;负责控制数据流在整个系统的各个组件间的流动过程&#xff0c;并且在特定动作发生时触发相应…

Couchbase 2.0归类视图简介

大多数应用程序必须处理“主/详细”类型的数据&#xff1a; 啤酒厂和啤酒 部门和员工 发票和项目 … 例如&#xff0c;这对于创建如下应用程序视图是必需的&#xff1a; 借助Couchbase和许多面向文档的数据库&#xff0c;您可以采用不同的方式来处理此问题&#xff0c;您…

(转)利用WPF的ListView进行大数据量异步加载

原文&#xff1a;http://www.cnblogs.com/scy251147/archive/2012/01/08/2305319.html 由于之前利用Winform的ListView进行大数据量加载的时候&#xff0c;诟病良多&#xff0c;所以今天试着用WPF的ListView来做了一下&#xff0c;结果没有让我失望&#xff0c;我将一个拥有430…

Css3新属性:calc()

一、前言 calc()看起来像是javascript中的一个函数&#xff0c;而事实上它是用在Css中的&#xff0c;可以用它来计算长度&#xff08;宽度或高度)&#xff0c;能够自动根据不同尺寸的屏幕自动调接数值&#xff0c;从而很轻松的实现自适应布局展示在不同尺寸屏幕下。项目中常常碰…

有关循环和判断的几个小问题

注意在while嵌套的if语句之外&#xff0c;还有一个cin>>n;因为刚刚没有这一部分的时候&#xff0c;执行的结果是这样的&#xff1a; 把while里面的cin>>n;注释掉了之后&#xff0c;在cmd里执行的时候&#xff0c;只能输入数字&#xff0c;但是没有任何的反应。 但其…

PHP7 学习笔记(五)安装event扩展(libevent)

一、描述&#xff1a;有效安排I/O&#xff0c;时间和信号的扩展 使用可用于特定平台的最佳I/O通知机制的事件,是PHP基础设施的libevent端口。 二、下载地址&#xff1a;http://pecl.php.net/package/event 三、安装支持库libevent&#xff0c;需要编译高版本&#xff08;这里以…

DeferredResult – Spring MVC中的异步处理

DeferredResult是一个可能尚未完成的计算的容器&#xff0c;它将在将来提供。 Spring MVC使用它来表示异步计算&#xff0c;并利用Servlet 3.0 AsyncContext异步请求处理。 简要介绍一下它是如何工作的&#xff1a; RequestMapping("/") ResponseBody public Deferr…

简单的GTK窗体搭建

#include<gtk/gtk.h> //必须引用gtk/gtk.h这个头文件2 int main(int argc,char *argv[]) //标准c语言主函数的声明3 {4 GtkWidget *window; //声明一个窗口控件的指针&#xff0c;其中GtkWidget是…

有关输出图形的代码,我觉得好难啊,好蒙啊。

这里的代码其实没看懂过&#xff0c;自己看到书上这一题的时候也是挺蒙的&#xff0c;压根不知道要怎么下手&#xff0c;照着书上把代码打进去之后也不清楚原理&#xff0c;可怕的是&#xff0c;反反复复对着答案敲了几遍代码&#xff0c;执行结果还是这样的&#xff0c;和课本…

《Web前端开发修炼之道》-读书笔记CSS部分

如何组织CSS-分层 应用 css 的能力分两部分&#xff1a;一部分是css的API&#xff0c;重点是如何用css控制页面内元素的样式&#xff1b;另一部分是css框架&#xff0c;重点是如何对 css 进行组织。如何组织 css 可以有多种角度&#xff0c;例如按功能划分&#xff0c;或者按区…

Windows环境变量的应用

设置环境变量快速打开程序 如果你对桌面上密密麻麻的文件感到烦恼&#xff0c;那么下面的方法可以帮到你。 Step 1 在硬盘的某个位置添加一个文件夹&#xff0c;把你经常用的程序的快捷方式放进这个文件夹&#xff0c;快捷方式重命名最好简单易记&#xff0c;如图 注意 快捷方式…

mysql 备份数据库_mysql数据库备份

前一段时间因为误操作删除了一张表的几条数据&#xff0c;弄得很尴尬&#xff0c;正好这周有空就折腾了下数据备份的知识&#xff0c;现把mysql的数据备份相关实践和心得总结如下&#xff1a;一.使用mysqldump命令备份数据库&#xff1a;备份整个数据库(包括表结构和数据),用法…

JavaScript:Browser 对象

ylbtech-JavaScript&#xff1a;Browser 对象1. Window 对象返回顶部 1、Window 对象 Window 对象 Window 对象表示浏览器中打开的窗口。 如果文档包含框架&#xff08;<frame> 或 <iframe> 标签&#xff09;&#xff0c;浏览器会为 HTML 文档创建一个 window 对象…