Comparator接口位于:java.util包中。

Comparator接口:
1. 强行对某个对象的Collection进行整体排序。
值得注意的是:
Comparator接口可以作为参数传到一些sort()方法中,例如:
Collection.sort(List<T> list, Comparator<? super T> c)、
Arrays.sort(T[] a, Comparator<? super T> c);

2. Comparator接口指定的顺序,可以不是字典顺序排序,但包含字典顺序排序!!!

现在让我们仍然对User进行排序吧!!!
Let's do it!!!

3. 有的人会觉得 实现Comparator接口 有点奇怪,Comparator接口中明明有两个方法: compare()、equals()
为什么实现此接口的类只用实现compare()方法呢?
其实稍加思索,就明白了:实现Comparator接口的类没有实现equals方法,是因为类里有equals()方法了,
所有的类都是从基类java.lang.Object中继承的,而Object类中已经有equals()方法了,
故而在你创建完成这个类,就已经实现了equals()方法了,是不是恍然大悟呢?!!!

User类的代码如下:

package test;

public class User {

	private String name;
private Integer age; public User(String name, Integer age) {
this.name = name;
this.age = age;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Integer getAge() {
return age;
} public void setAge(Integer age) {
this.age = age;
} @Override
public String toString() {
return "User [name=" + name + ", age=" + age + "]";
} }

  看下实现Comparator接口的类UserComparator的代码:

package test;

import java.util.Comparator;

public class UserComparator implements Comparator<User>{

	@Override
public int compare(User o1, User o2) {
int flag = o1.getName().compareTo(o2.getName());
if(flag == 0) {
flag = o1.getAge().compareTo(o1.getAge());
}
return flag;
} }

  接着我们要进行测试了哈!UserTest.java的代码如下:

package test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List; public class UserTest { public static void print(List<User> list) {
for(User u : list) {
System.out.println(u);
}
} public static void print(User[] array) {
for(int i=0; i<array.length; i++) {
System.out.println(array[i]);
}
} public static void main(String[] args) { List<User> users = new ArrayList<User>();
users.add(new User("a",12));
users.add(new User("C",25));
users.add(new User("B",12));
users.add(new User("A",15));
users.add(new User("b",19));
users.add(new User("c",17));
users.add(new User("a",22)); User[] users2 = new User[]{
new User("a",12),
new User("C",25),
new User("B",12),
new User("A",15),
new User("b",19),
new User("c",17),
new User("a",22)
};
System.out.println("=========================Comparator接口的测试=========================");
System.out.println("List排序前:");
print(users); System.out.println();
System.out.println(); System.out.println("List排序后:");
Collections.sort(users, new UserComparator());
print(users); System.out.println("--------------------------------------------");
System.out.println();
System.out.println();
System.out.println();
System.out.println(); System.out.println("Array排序前:");
print(users2); System.out.println();
System.out.println(); System.out.println("Array排序后:");
Arrays.sort(users2, new UserComparator());
print(users2); } }

  测试的结果如下:

=========================Comparator接口的测试=========================
List排序前:
User [name=a, age=12]
User [name=C, age=25]
User [name=B, age=12]
User [name=A, age=15]
User [name=b, age=19]
User [name=c, age=17]
User [name=a, age=22] List排序后:
User [name=A, age=15]
User [name=B, age=12]
User [name=C, age=25]
User [name=a, age=12]
User [name=a, age=22]
User [name=b, age=19]
User [name=c, age=17]
-------------------------------------------- Array排序前:
User [name=a, age=12]
User [name=C, age=25]
User [name=B, age=12]
User [name=A, age=15]
User [name=b, age=19]
User [name=c, age=17]
User [name=a, age=22] Array排序后:
User [name=A, age=15]
User [name=B, age=12]
User [name=C, age=25]
User [name=a, age=12]
User [name=a, age=22]
User [name=b, age=19]
User [name=c, age=17]

以上是按照字典顺序进行排序,今天想着实现一个字典顺序的倒序排序,大家一起来讨论下吧!!

下面是UserComparator2的代码:

package test;

import java.util.Comparator;

public class UserComparator2 implements Comparator<User>{

	@Override
public int compare(User o1, User o2) {
int flag = 0;
flag = sort(o1.getName(), o2.getName());
if(flag == 0) {
flag = o1.getAge().compareTo(o2.getAge());
}
return flag;
} /*
* 字典顺序的倒序排序,z是第一个,A是最后一个,
* 如果A<B,返回1
* A=B,返回0
* A>B,返回-1
*/
public int sort(String s1, String s2) {
int flag = 0;
//获取s1、s2的字符序列
char[] c1 = s1.toCharArray();
char[] c2 = s2.toCharArray();
//设置循环的次数,取字符串长度小的
int length1 = s1.length();
int length2 = s2.length();
int longer = c1.length - c2.length;
int count = longer>=0 ? length2 : length1; for(int i=0; i<count; i++) {
//取出每个字符串上对应的字符,进行比较
char charS1 = c1[i];
char charS2 = c2[i]; int result = charS1 - charS2;
if(result < 0) {
flag = 1;
break;
}else if(result > 0) {
flag = -1;
break;
}else {
flag = 0;
}
} //如果是这种情况:jim、jime,则jime排在前
if(flag == 0) {
if(longer < 0) {
//长度长的排前面
flag = 1;
}else if(longer > 0) {
flag = -1;
}else {
flag = 0;
}
} return flag;
} }

  然后,让我们开始进行测试吧:

package test;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List; public class UserTest2 { public static void print(List<User> list) {
for(User u : list) {
System.out.println(u);
}
} public static void main(String[] args) {
List<User> users = new ArrayList<User>();
users.add(new User("jim",12));
users.add(new User("joe",25));
users.add(new User("jime",12));
users.add(new User("tom",15));
users.add(new User("tom",17));
users.add(new User("andy",19));
users.add(new User("cwayi",17));
users.add(new User("zendy",22));
users.add(new User("yorick",33));
users.add(new User("maomi",22)); System.out.println("=========================Comparator接口的测试=========================");
System.out.println("List排序前:");
print(users); System.out.println();
System.out.println(); System.out.println("List排序后:");
Collections.sort(users, new UserComparator2());
print(users); System.out.println("--------------------------------------------");
}
/*
* 预想的结果应该是:
* zendy--22
* yorick--33
* tom--15
* tom--17
* maomi--22
* joe--25
* jime--12
* jim--12
* cwayi--17
* andy--19
*/ }

  程序运行的结果如下:

=========================Comparator接口的测试=========================
List排序前:
User [name=jim, age=12]
User [name=joe, age=25]
User [name=jime, age=12]
User [name=tom, age=15]
User [name=tom, age=17]
User [name=andy, age=19]
User [name=cwayi, age=17]
User [name=zendy, age=22]
User [name=yorick, age=33]
User [name=maomi, age=22] List排序后:
User [name=zendy, age=22]
User [name=yorick, age=33]
User [name=tom, age=15]
User [name=tom, age=17]
User [name=maomi, age=22]
User [name=joe, age=25]
User [name=jime, age=12]
User [name=jim, age=12]
User [name=cwayi, age=17]
User [name=andy, age=19]
--------------------------------------------

  是不是很有意思呢?!以上就是Comparator接口的学习了,快来一起学习吧!

Comparable接口与Comparator接口的比较————Comparator接口详解的更多相关文章

  1. Mybatis中接口和对应的mapper文件位置配置详解

    Mybatis中接口和对应的mapper文件位置配置详解 原链接为:https://blog.csdn.net/fanfanzk1314/article/details/71480954 今天遇到一个 ...

  2. Java基础学习(四)-- 接口、集合框架、Collection、泛型详解

    接口 一.接口的基本概念 关键字为:Interface,在JAVA编程语言中是一个抽象类型,是抽象方法的集合.也是使用.java文件编写.   二.接口声明 命名规范:与类名的命名规范相同,通常情况下 ...

  3. 【高速接口-RapidIO】4、Xilinx RapidIO核详解

    一.RapidIO核概述 RapidIO核的设计标准来源于RapidIO Interconnect Specification rev2.2,它支持1x,2x和4x三种模式,每通道的速度支持1.25G ...

  4. mybatis中的mapper接口文件以及selectByExample类的实例函数详解

    记录分为两个部分,第一部分主要关注selectByExample类的实例函数的实现:第二部分讨论Mybatis框架下基本的实例函数. (一)selectByExample类的实例函数的实现 当你启动项 ...

  5. java接口自动化(一) - 接口自动化测试整体认知 - 开山篇(超详解)

    简介 了解什么是接口和为什么要做接口测试.并且知道接口自动化测试应该学习哪些技术以及接口自动化测试的落地过程.其实这些基本上在python接口自动化的文章中已经详细的介绍过了,不清楚的可以过去看看.了 ...

  6. Java6.0中Comparable接口与Comparator接口详解

    Java6.0中Comparable接口与Comparator接口详解 说到现在,读者应该对Comparable接口有了大概的了解,但是为什么又要有一个Comparator接口呢?难道Java的开发者 ...

  7. Java Comparable 和 Comparator 接口详解

    本文基于 JDK8 分析 Comparable Comparable 接口位于 java.lang 包下,Comparable 接口下有一个 compareTo 方法,称为自然比较方法.一个类只要实现 ...

  8. 【Java入门提高篇】Day19 Java容器类详解(二)Map接口

    上一篇里介绍了容器家族里的大族长——Collection接口,今天来看看容器家族里的二族长——Map接口. Map也是容器家族的一个大分支,但里面的元素都是以键值对(key-value)的形式存放的, ...

  9. map接口详解

    1.Map接口详解(1)映射(map)是一个存储键.键值对的对象,给定一个键,可以查询得到它的值,键和值都可以是对象(2)键必须是唯一的,值可以重复(Map接口映射唯一的键到值)(3)有些映射可以接收 ...

  10. 详解 Set接口

    (请关注 本人"集合"总集篇博文--<详解 Collection接口>) 在Collection接口的子接口中,最重要的,也是最常见的两个-- List接口 和 Set ...

随机推荐

  1. noip2018day1-赛道修建

    题目描述 \(C\) 城将要举办一系列的赛车比赛.在比赛前,需要在城内修建 $m $条赛道. \(C\) 城一共有 \(n\) 个路口,这些路口编号为 \(1,2,-,n\)有 $n-1 $条适合于修 ...

  2. python正则表达式re 中m.group和m.groups的解释

    转载:http://www.cnblogs.com/kaituorensheng/archive/2012/08/20/2648209.html 先看代码instance: >>> ...

  3. eclipse经常弹出Subversion Native Library Not Available解决方案

  4. docker安装笔记

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相 ...

  5. EditPlus配置Java编译器

    一.环境说明 系统: windows 7 64位 editplus version:  4.3 二.设置步骤 打开工具中的配置用户工具: 找到用户工具User tools,点击组名Group Name ...

  6. HDU - 1024 Max Sum Plus Plus 最大m段子段和+滚动数组优化

    给定n个数字,求其中m段的最大值(段与段之间不用连续,但是一段中要连续) 例如:2 5 1 -2 2 3 -1五个数字中选2个,选择1和2 3这两段. dp[i][j]从前j个数字中选择i段,然后根据 ...

  7. u-boot log_init函数分析

    log_init, int log_init(void){    struct log_driver *drv = ll_entry_start(struct log_driver, log_driv ...

  8. Java基本的程序结构设计 整形和浮点型

    整形: int 4字节 short 2字节 long 8字节 byte 1字节 int的大小差不多是20亿. 整形计算 如果两个int进行加减乘除数学运算的时候,最终的结果仍然是int,有可能出现了溢 ...

  9. 【洛谷P3723】礼物

    题目大意:给定两个序列 A.B,现可以将 A 序列的每一个元素的值增加或减少 C,求 \(\sum\limits_{i=0}^{n-1}(a_i-b_{i+k})^2\) 的最小值是多少. 题解:先不 ...

  10. 通过继承Thread类实现多线程

    (1)继承Thread类(2)重写run(方法(3)通过start0方法启动线程 一定的缺点: Java中的类是单继承的,一旦继承了Thread类,就不允许再去继承其它的类 线程和主方法之间的执行顺序 ...