public interface Comparator<T>

接口里面的方法

int    compare(T o1, T o2)
o1 > o2 返回 1
o1 = o2 返回 0
o1 < o2 返回 -1 boolean equals(Object obj)
判断是否相等

其他方法:https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html


强行对某个对象 collection 进行整体排序 的比较函数。可以将 Comparator 传递给 sort 方法(如 Collections.sortArrays.sort),从而允许在排序顺序上实现精确控制。还可以使用 Comparator 来控制某些数据结构(如有序 set有序映射)的顺序,或者为那些没有自然顺序的对象 collection 提供排序。

将数组中偶数排的后面

实现Comparator接口

class myComparator implements Comparator<Integer>{
public int compare(Integer a,Integer b){
return a%2==0?1:-1;
}
}

Comparator 传递给 sort 方法

package arrays1;
import java.util.Arrays;
import java.util.Comparator;
class myComparator implements Comparator<Integer>{
public int compare(Integer a,Integer b){
return a%2==0?1:-1;
}
}
public class myArray {
public void mySort(){
Integer[] A = new Integer[]{2,0,345,234,12,34,23};
System.out.println(Arrays.toString(A));
Arrays.sort(A,new myComparator()); System.out.println(Arrays.toString(A));
}
public static void main(String[] args){
new myArray().mySort();
}
}

输出结果:

[2, 0, 345, 234, 12, 34, 23]
[23, 345, 2, 0, 234, 12, 34]

上面传递的是一个实例类对象

我们可以根据上节讲的内部类实现

package arrays1;
import java.util.Arrays;
import java.util.Comparator;
public class myArray {
class innerComparator implements Comparator<Integer>{
public int compare(Integer a,Integer b){
return a%2==0?1:-1;
}
}
public void mySort(){
Integer[] A = new Integer[]{2,0,345,234,12,34,23};
System.out.println(Arrays.toString(A)); Arrays.sort(A,new innerComparator()); System.out.println(Arrays.toString(A));
}
public static void main(String[] args){
new myArray().mySort();
}
}

上面是成员内部类

也可以讲内部类写在方法中,

package arrays1;
import java.util.Arrays;
import java.util.Comparator; public class myArray { public void mySort(){
Integer[] A = new Integer[]{2,0,345,234,12,34,23};
System.out.println(Arrays.toString(A)); Arrays.sort(A,new Comparator<Integer>(){
public int compare(Integer a,Integer b){
return a%2==0?1:-1;
}
});
System.out.println(Arrays.toString(A));
}
public static void main(String[] args){
new myArray().mySort();
}
}

上面输出结果都一样

上面全部程序

package arrays1;
import java.util.Arrays;
import java.util.Comparator;
class myComparator implements Comparator<Integer>{
public int compare(Integer a,Integer b){
return a%2==0?1:-1;
}
}
public class myArray {
class innerComparator implements Comparator<Integer>{
public int compare(Integer a,Integer b){
return b - a;
}
}
public void mySort(){
Integer[] A = new Integer[]{2,0,345,234,12,34,23};
System.out.println(Arrays.toString(A));
// Arrays.sort(A,new myComparator());
//
// System.out.println(Arrays.toString(A));
// Arrays.sort(A,new innerComparator());
//
// System.out.println(Arrays.toString(A));
Arrays.sort(A,new Comparator<Integer>(){
public int compare(Integer a,Integer b){
return a%2==0?1:-1;
}
});
System.out.println(Arrays.toString(A));
}
public static void main(String[] args){
new myArray().mySort();
}
}

对人按照年龄排序

定义People类

class People{
int sex;
int age;
String name;
People(int sex,int age,String name){
this.sex = sex;
this.age = age;
this.name = name;
}
public void setSex(int sex){
this.sex = sex;
}
public void setAge(int age){
this.age = age;
}
public void setName(String name){
this.name = name;
}
public int getSex() {
return sex;
}
public int getAge() {
return age;
}
public String getName() {
return name;
}
public String toString(){
String p = "sex: "+sex+" age: "+ age+" name: "+ name+"\n";
return p;
}
}

实现Comparator接口,按照年龄排序,这里通过内部类实现的

public class myArray {
class innerComparatorAge implements Comparator<People>{
public int compare(People a,People b){ // 按照年龄升序
return a.age - b.age;
}
}
public void mySort(){
int N = 10;
People[] A = new People[N];
Random rand = new Random();
for(int i = 0;i< N;i++){
int sex = rand.nextInt(2);
int age = 10+ rand.nextInt(40);
String name = ""+rand.nextInt(2000);
A[i] = new People(sex,age,name);
} System.out.println(Arrays.toString(A));
System.out.println("排序后:");
Arrays.sort(A,new innerComparatorAge());
System.out.println(Arrays.toString(A));
}
public static void main(String[] args){
new myArray().mySort();
}
}

输出

[sex: 0 age: 23 name: 1067
, sex: 0 age: 16 name: 416
, sex: 1 age: 37 name: 465
, sex: 0 age: 13 name: 1667
, sex: 0 age: 46 name: 1698
, sex: 0 age: 13 name: 528
, sex: 1 age: 21 name: 1558
, sex: 0 age: 18 name: 1386
, sex: 1 age: 49 name: 249
, sex: 1 age: 34 name: 178
]
排序后:
[sex: 0 age: 13 name: 1667
, sex: 0 age: 13 name: 528
, sex: 0 age: 16 name: 416
, sex: 0 age: 18 name: 1386
, sex: 1 age: 21 name: 1558
, sex: 0 age: 23 name: 1067
, sex: 1 age: 34 name: 178
, sex: 1 age: 37 name: 465
, sex: 0 age: 46 name: 1698
, sex: 1 age: 49 name: 249
]

当然也可以修改按照其他方式排序

按照性别排序,当性别相同的时候按照年龄排序

    class innerComparatorSexAge implements Comparator<People>{
public int compare(People a,People b){
if(a.sex > b.sex)
return 1;
else if(a.sex < b.sex)
return -1;
else
return a.age - b.age;
}
}

输出

[sex: 0 age: 43 name: 1284
, sex: 1 age: 11 name: 141
, sex: 0 age: 36 name: 1217
, sex: 0 age: 12 name: 1804
, sex: 0 age: 32 name: 1943
, sex: 0 age: 19 name: 1670
, sex: 1 age: 49 name: 656
, sex: 0 age: 36 name: 1349
, sex: 1 age: 13 name: 1542
, sex: 0 age: 18 name: 612
]
排序后:
[sex: 0 age: 12 name: 1804
, sex: 0 age: 18 name: 612
, sex: 0 age: 19 name: 1670
, sex: 0 age: 32 name: 1943
, sex: 0 age: 36 name: 1217
, sex: 0 age: 36 name: 1349
, sex: 0 age: 43 name: 1284
, sex: 1 age: 11 name: 141
, sex: 1 age: 13 name: 1542
, sex: 1 age: 49 name: 656
]

programcreek中整理的

实现Comparator 对Arrays , ArrayList , TreeSet ,TreeMap ,HashMap 排序

注意:对Map排序需要新建一个Map,将为排序的Map元素放入到新的Map中,这里是通过Key进行排序的

ArrayList

// Collections.sort
List<ObjectName> list = new ArrayList<ObjectName>();
Collections.sort(list, new Comparator<ObjectName>() {
public int compare(ObjectName o1, ObjectName o2) {
return o1.toString().compareTo(o2.toString());
}
});
Arrays
// Arrays.sort
ObjectName[] arr = new ObjectName[10];
Arrays.sort(arr, new Comparator<ObjectName>() {
public int compare(ObjectName o1, ObjectName o2) {
return o1.toString().compareTo(o2.toString());
}
});

TreeSet

// TreeSet
Set<ObjectName> sortedSet = new TreeSet<ObjectName>(new Comparator<ObjectName>() {
public int compare(ObjectName o1, ObjectName o2) {
return o1.toString().compareTo(o2.toString());
}
});
sortedSet.addAll(unsortedSet);

TreeMap

// TreeMap - using String.CASE_INSENSITIVE_ORDER which is a Comparator that orders Strings by compareToIgnoreCase
Map<String, Integer> sortedMap = new TreeMap<String, Integer>(String.CASE_INSENSITIVE_ORDER);
sortedMap.putAll(unsortedMap);
//TreeMap - In general, defined comparator
Map<ObjectName, String> sortedMap = new TreeMap<ObjectName, String>(new Comparator<ObjectName>() {
public int compare(ObjectName o1, ObjectName o2) {
return o1.toString().compareTo(o2.toString());
}
});
sortedMap.putAll(unsortedMap);

给个题目:

组成最大数

Java:Comparator接口的更多相关文章

  1. JAVA Comparator 接口排序用法

    java的比较器有两类,分别是Comparable接口和Comparator接口. 在为对象数组进行排序时,比较器的作用非常明显,首先来讲解Comparable接口. 让需要进行排序的对象实现Comp ...

  2. Java Comparator接口学习笔记

    Comparator是一个泛型函数式接口,T表示待比较对象的类型: @FunctionalInterface public interface Comparator<T> { } 本文将主 ...

  3. Java中Comparable和Comparator接口区别分析

    Java中Comparable和Comparator接口区别分析 来源:码农网 | 时间:2015-03-16 10:25:20 | 阅读数:8902 [导读] 本文要来详细分析一下Java中Comp ...

  4. Java中的Comparable接口和Comparator接口

    Comparator位于包java.util下,比较器,是在集合外部定义排序.Comparable位于包java.lang下,代表当前对象可比较的,是在集合内部实现排序. Comparable代表一个 ...

  5. Java之Comparable接口和Comparator接口

    Comparable & Comparator 都是用来实现集合中元素的比较.排序的: Comparable 是在集合内部定义的方法实现的排序: Comparator 是在集合外部实现的排序: ...

  6. Java中实现对象的比较:Comparable接口和Comparator接口

    在实际应用中,我们往往有需要比较两个自定义对象大小的地方.而这些自定义对象的比较,就不像简单的整型数据那么简单,它们往往包含有许多的属性,我们一般都是根据这些属性对自定义对象进行比较的.所以Java中 ...

  7. JAVA排序(二) Comparator接口

    接着说关于Comparator接口, java.util Interface Comparator<T>(该泛型指定的是被比较的类),使用该接口不需要在待比较类进行比较操作,即在不修改源码 ...

  8. Java TreeSet集合排序 && 定义一个类实现Comparator接口,覆盖compare方法 && 按照字符串长度排序

    package TreeSetTest; import java.util.Iterator; import java.util.TreeSet; import javax.management.Ru ...

  9. Java中 Comparator接口 与Comparable 的区别

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt159 comparator接口与Comparable接口的区别 1. Com ...

随机推荐

  1. [转]论window和Linux之长短

    论window和Linux之长短 王垠 http://www.kerneltravel.net/jiqiao/whyLinux.htm — 摈弃 Windows 低效率的工作方式,发掘 Linux 身 ...

  2. HTML/CSS的学习过程一览

    HTML/CSS的学习过程一览 说明 调试工具使用的是Google Chrome浏览器,其余浏览器出现的问题,这锅我不背[傲娇脸 可以使用浏览器查看源代码 网页列表 HTML_CSS_1 HTML基本 ...

  3. 创建并配置Filter

    创建Filter需要两个步骤: 创建FIlter处理类. web.xml文件中配置Filter. 创建Filter类 创建Filter必须实现javax.servlet.Filter接口,在该接口中定 ...

  4. 了解struts2 action的一些原理

    今天在struts2中的 action方法中,打印了一下当前action,即this,还打印了一下当前action引用的service, 在页面中访问该action方法2次,发现action是不一样的 ...

  5. 为什么X86汇编中的mov指令不支持内存到内存的寻址?

    在X86汇编中,MOV [0012H], [0016H]这种指令是不允许的,至少得有一个操作数是寄存器.当然,这种问题在用高级语言的时候看不到,感觉好像基本上都是从内存到内存啊,为毛到了汇编就不行了? ...

  6. Ruby 多线程探索实践与归纳总结

    Ruby 多线程 每个正在系统上运行的程序都是一个进程.每个进程包含一到多个线程. 线程是程序中一个单一的顺序控制流程,在单个程序中同时运行多个线程完成不同的工作,称为多线程. Ruby 中我们可以通 ...

  7. 22、DDMS(转载)

    本文是转载,出处为http://www.xuebuyuan.com/1291595.html 如需删除本文,请私信我,谢谢 DDMS DDMS是一款Google* 提供的应用,可作为独立的工具运行,也 ...

  8. spring--注入类型--构造方法(不常用)

    3.3.1.1. Constructor Injection Constructor-based DI is effected by invoking a constructor with a num ...

  9. zoj 2314 Reactor Cooling 网络流

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1314 The terrorist group leaded by a ...

  10. Matlab画柱状和折线对照图

        上面是效果图,看着很不错吧,主要的问题在于用XTickLabel设置横坐标时候,横坐标会扩展,就是说如果label是[1 2 3],咱就做了三组试验,参数分别是 1 2 3,但是显示是1 2 ...