Java基础之一组有用的类——使用比较器对数组排序(TrySortingWithComparator)
控制台程序。
Arrays类中的sort()静态方法把传送为参数的数组元素按升序方式排序。
对于第一个参数类型是Object[]的sort()方法来说,可以传送任意类型的数组。如果使用sort()方法的任何一个版本对对象数组排序,对象就必须支持Comparable<>接口,因为sort()方法使用了compareTo()方法。
sort()方法的另外两个用来对对象数组排序的版本是参数化方法。它们在对数组排序是,使用外部的比较器对象来确定对象的顺序。比较器对象的类必须实现java.util.Comparator<>接口。使用外部比较器的优点是:可以根据不同的情况使用几个比较器得到不同的顺序。例如,在一些情况下,要按照名字对姓名文件排序;而在另外一些情况下,则要按照姓氏排序。此时不能使用类已经实现的Comparable<>接口。使用比较器的sort()方法的第一个版本是:
<T>void sort(T[] array,Comparator<? super T> comparator)
这个方法会使用传送为第二个参数的比较器对array的所有元素排序。
Comparator<T>接口声明了两个方法。第一个方法是compare(),sort()方法使用它来比较T[]类型的数组元素。第二个方法是equals(),用于比较Comparator<>对象是否相等。
public class Person implements Comparable<Person> {
// Constructor
public Person(String firstName, String surname) {
this.firstName = firstName;
this.surname = surname;
}
@Override
public String toString() {
return firstName + " " + surname;
}
// Compare Person objects
public int compareTo(Person person) {
int result = surname.compareTo(person.surname);
return result == 0 ? firstName.compareTo(person.firstName):result;
}
public String getFirstName() {
return firstName;
}
public String getSurname() {
return surname;
}
private String firstName; // First name of person
private String surname; // Second name of person
}
import java.util.Comparator;
public class ComparePersons implements Comparator<Person> {
// Method to compare Person objects - order is descending
public int compare(Person person1, Person person2) {
int result = -person1.getSurname().compareTo(person2.getSurname());
return result == 0 ? -person1.getFirstName().compareTo(person2.getFirstName()) : result;
}
// Method to compare with another comparator
public boolean equals(Object comparator) {
if(this == comparator) { // If argument is the same object
return true; // then it must be equal
}
if(comparator == null) { // If argument is null
return false; // then it can抰 be equal
}
return getClass() == comparator.getClass(); // Class must be the same for equal
}
}
import java.util.Arrays;
public class TrySortingWithComparator {
public static void main(String[] args) {
Person[] authors = {
new Person("Danielle", "Steel"), new Person("John", "Grisham"),
new Person("Tom", "Clancy"), new Person("Christina", "Schwartz"),
new Person("Patricia", "Cornwell"), new Person("Bill", "Bryson")
};
System.out.println("Original order:");
for(Person author : authors) {
System.out.println(author);
}
Arrays.sort(authors, new ComparePersons()); // Sort using comparator
System.out.println("\nOrder after sorting using comparator:");
for(Person author : authors) {
System.out.println(author);
}
Arrays.sort(authors); // Sort using compareTo() method
System.out.println("\nOrder after sorting using compareTo() method:");
for(Person author : authors) {
System.out.println(author);
}
}
}
Java基础之一组有用的类——使用比较器对数组排序(TrySortingWithComparator)的更多相关文章
- Java基础之一组有用的类——为标记定义自己的模式(ScanString)
控制台程序. Scanner类提供了一种方式,用来指定如何识别标记.这需要使用next()方法的两个重载版本.其中的一个版本接受Pattern类型的参数.另一个版本接受String类型的参数,用来指定 ...
- Java基础之一组有用的类——使用Scanner对象(TryScanner)
控制台程序. java.util.Scanner类定义的对象使用正则表达式来扫描来自各种源的字符输入,并把输入显示为各种基本类型的一系列标记或者显示为字符串. 默认情况下,Scanner对象读取标记时 ...
- Java基础之一组有用的类——使用正则表达式搜索子字符串(TryRegex)
控制台程序. 正则表达式只是一个字符串,描述了在其他字符串中搜索匹配的模式.但这不是被动地进行字符序列匹配,正则表达式其实是一个微型程序,用于一种特殊的计算机——状态机.状态机并不是真正的机器,而是软 ...
- Java基础之一组有用的类——使用公历日历(TryCalendar)
控制台程序. 公历是西方使用的日历,用GregorianCalendar类的对象来表示.GregorianCalendar对象封装了时区信息.日期和时间数据.GregorianCalendar对象有7 ...
- Java基础之一组有用的类——生成日期和时间(TryDateFormats)
控制台程序. java.util包中含有相当多的类涉及日期和时间,包括Date类.Calendar类和GregorianCalendar类. Date类对象其实定义了精确到毫秒的时刻,从1970年1月 ...
- Java基础之一组有用的类——Observable和Observer对象(Horrific)
控制台程序. Obserable类提供了一个有趣的机制,可以把类对象中发生的改变通知给许多其他类对象. 对于可以观察的对象来说,类定义中需要使用java.util.Observable类.只需要简单地 ...
- Java基础之一组有用的类——使用二叉树搜索算法搜索某个作者(TryBinarySearch)
控制台程序. Arrays类中的binarySearch()静态方法使用二叉树搜索算法,在有序数组中查找包含给定值的元素.只有当数组的元素按升序方式排序时,该方法才是最有效的,否则就应在调用binar ...
- Java基础之一组有用的类——使用正则表达式查找和替换(SearchAndReplace)
控制台程序. 使用正则表达式执行查找和替换操作,只需要调用Matcher对象的find()方法,就可以调用appendReplacement()方法来替换匹配的子序列.在提供给方法的新StringBu ...
- Java基础-类加载机制与自定义类Java类加载器(ClassLoader)
Java基础-类加载机制与自定义类Java类加载器(ClassLoader) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 关于类加载器的概念和分类我就不再废话了,因为我在之前的笔 ...
随机推荐
- MySQL存储引擎总结
MySQL存储引擎总结 作者:果冻想 字体:[增加 减小] 类型:转载 这篇文章主要介绍了MySQL存储引擎总结,本文讲解了什么是存储引擎.MyISAM.InnoDB.MEMORY.MERGE等内 ...
- 实时查看linux网卡流量
将下列脚本保存为可执行脚本文件,比如叫traff.sh. 1.本脚本可自定义欲查看接口,精确到小数,并可根据流量大小灵活显示单位. 2.此脚本的采集间隔为1秒. 3.此脚本不需要额外再安装软件,可在急 ...
- phone number is not known @w@ have no phone, and thus no phone number
http://dev.mysql.com/doc/refman/5.7/en/problems-with-null.html B.5.4.3 Problems with NULL Values The ...
- 特征向量-Eigenvalues_and_eigenvectors#Graphs
https://en.wikipedia.org/wiki/Eigenvalues_and_eigenvectors#Graphs A {\displaystyle A} ...
- Delphi Application.MessageBox详解
引数:1. Text:要显示的讯息2. Caption:讯息视窗的标题列文字3. Flags:讯息旗标 3.1. 可指定讯息视窗上的图示 3.2. 可指定讯息视窗出现的按钮 3 ...
- java 客户端获取真实ip地址
在开发工作中,我们常常需要获取客户端的IP.一般获取客户端的IP地址的方法是:request.getRemoteAddr();但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实 ...
- FW nexus docker
原文地址: http://www.cnblogs.com/wzy5223/p/5410990.html Nexus 3.0 可以创建三种docker仓库: 1. docker (proxy) ...
- 那些证书相关的玩意儿(SSL,X.509,PEM,DER,CRT,CER,KEY,CSR,P12等)[zz]
openssl dgst –sign privatekey.pem –sha1 –keyform PEM –c c:\server.pem 将文件用sha1摘要,并用privatekey.pem中的私 ...
- centos FTP服务器的架设和配置
yum install vsftpd 2.启动/重启/关闭vsftpd服务器 [root@localhost ftp]# /sbin/service vsftpd restart Shutting d ...
- hiveserver2以及beeline客户端的使用
一:开启服务 1.启动前端的hiveserver2 按住ctrl+c就可以结束这个服务. 2.怎么知道已经开启的服务 如果进程在后台,可以查出来,kill这些进程. 3.后端开启服务 二:beelin ...