1.comparator是java的一种机制,用来帮助我们给相同对象的不同属性排序

2.Comparable接口,是一个对象本身就已经支持自比较所需要实现的接口,如String,Integer自己就已经实现了Comparable接口,可以完成比较大小的操作,在sort时,如果不指定Comparator就以自然顺序排序,即实现Comparable接口设定的排序方式

3.Comparator是一个专用的比较器,当对象不支持自比较或者自比较函数必能满足要求时,可以通过写一个比较器来完成两个对象之间的大小的比较。

比如java.util.Arrays下就有按照自然排序的Arrays.sort(a)和按照自定义排序的Arrays.sort(a,cmp)cmp指Comparator

4.举例,对Student对象的不同属性排序

package com.cx.sort;

import java.util.Comparator;

public class Student {
private String name;
private int id;
public static final Comparator<Student> By_NAME=new ByName();
public static final Comparator<Student> By_ID=new ById(); public String getName() {
return name;
}
public int getId() {
return id;
}
public Student(String name,int id) {
this.name=name;
this.id=id;
}
//按照名字排序
private static class ByName implements Comparator<Student>{
public int compare(Student v, Student w) {
return v.name.compareTo(w.name);
}
}
//按照id排序
private static class ById implements Comparator<Student> {
public int compare(Student v, Student w) {
return v.id-w.id;
}
}
}
package com.cx.sort;

import java.util.Comparator;

public class Test {
public static void sort(Object[] a,Comparator comparator) {
//插入排序
int N=a.length;
for(int i=1;i<N;i++) {
for(int j=i;j>0 && less(comparator,a[j],a[j-1]);j--) {
exch(a,j,j-1);
}
}
}
private static boolean less(Comparator c,Object v,Object w) {
//Comparator里的方法是compare()
//Comparable里的方法是compareTo()
return c.compare(v, w)<0;
}
private static void exch(Object[] a,int i,int j) {
Object swap=a[i]; a[i]=a[j]; a[j]=swap;
} private static void show(Student[] a) {
for(int i=0;i<a.length;i++) {
System.out.println("姓名:"+a[i].getName()+" "+"编号:"+a[i].getId());
}
} public static void main(String[] args) {
Student a=new Student("a", 5);
Student b=new Student("b", 1);
Student[] stu= {a,b};
System.out.println("按照编号排序");
sort(stu, Student.By_ID);
show(stu);
System.out.println("按照姓名排序:");
sort(stu,Student.By_NAME);
show(stu);
} }

结果:

按照编号排序
姓名:b 编号:1
姓名:a 编号:5
按照姓名排序:
姓名:a 编号:5
姓名:b 编号:1

2.3 comparator(比较器)的更多相关文章

  1. java.util下有一个Comparator(比较器)

    java.util下有一个Comparator(比较器) 它拥有compare(),用来比较两个方法. 要生成比较器,则用Sort中Sort(List,List(Compate)) 第二种方法更灵活, ...

  2. Comparable比较器和Comparator比较器

    1.Comparable比较器 在Arrays类中存在sort()排序方法,此方法可以直接对对象数组进行排序. public static void sort(Object[] a 根据元素的自然顺序 ...

  3. Comparator比较器

    Comparator比较器 简介 为什么写? comparator 是javase中的接口,位于java.util包下,该接口抽象度极高,有必要掌握该接口的使用 大多数文章告诉大家comparator ...

  4. java中Comparator比较器顺序问题,源码分析

    提示: 分析过程是个人的一些理解,如有不对的地方,还请大家见谅,指出错误,共同学习. 源码分析过程中由于我写的注释比较啰嗦.比较多,导致文中源代码不清晰,还请一遍参照源代码,一遍参照本文进行阅读. 原 ...

  5. 菜鸡的Java笔记 comparator 比较器

    1.数组操作类: Arrays        2.两种比较器的使用: Comparable Comparator        3.实现二叉树算法            content (内容)   ...

  6. java:Comparator比较器

    /*Comparator是java.util包里的一个接口,使用时应该实现导入相应的包, *再写一个实现了Comparator接口的类,并复写int compare(Object o)方法, *写出你 ...

  7. Java Object类 instanceof关键字 练习:判断是否为同一人 集合按照人的年龄排序,如果年龄相同按名字的字母顺序升序 Comparator比较器

    package com.swift; public class Same_Person_Test { public static void main(String[] args) { /* * Obj ...

  8. java Comparator比较器排序法

    注意:排序的字段不为空,否则抛出空指针异常! 第一步:先编写一个比较器类 如下: 第二步:此集合的对象 EO 必须重写 此equals 方法 如图: 第三步:调用使用此比较器 如图:

  9. Java之ArrayList自定义排序,通过实现comparator比较器接口

    两种排序方式: 1.实体类实现Comparable接口,重写compareTo(T o)方法,在其中定义排序规则,那么就可以直接调用Collections.sort()来排序对象数组 2.在调用方法的 ...

随机推荐

  1. AJPFX关于多态的应用

    要求设计一个方法,要求此方法可以接受A类的任意子类对象,并调用方法,此时,如果不使用对象多态性,那代码肯定会类似如下 class A{                    // 定义类A publi ...

  2. 客户端负载均衡 - Ribbon

    Ribbon是Netflix公司开源的一个负载均衡的项目(https://github.com/Netflix/ribbon),它是一个基于HTTP.TCP的客户端负载均衡器. 服务端负载均衡 负载均 ...

  3. html5改良的input元素的种类

    1.url类型.email类型.date类型.time类型.datetime类型.datetime-local类型. month类型.week类型.number类型.range类型.search类型. ...

  4. jdk线程池,使用手记

    Executors----------------------------------------------Executors------------------------------------ ...

  5. oracle 安装,启动 ,plsql 连接

    1.下载oracle 服务器端,正常安装,在选择桌面类或者是服务器类的时候选择服务器类. 2.下载oracle 客户端解压版 下载地址   链接:https://pan.baidu.com/s/1mi ...

  6. java urlEncode 和urlDecode的用法

    前台进行http请求的时候 如果要对中问进行编码,要使用两次编码 String zhName=urlEncode.encode((urlEncode.encode("中文",&qu ...

  7. SQL Server xtype的介绍

    sysobjects 表 在数据库内创建的每个对象(约束.默认值.日志.规则.存储过程等)在表中占一行.只有在 tempdb 内,每个临时对象才在该表中占一行. 列名 数据类型 描述 name sys ...

  8. 看到了一篇不错的tensorflow文章

    http://dataunion.org/28906.html 本文作者 Steven Dufresne,总结了新手学 TensorFlow 需要的核心知识点和实操内容,旨在鼓励更多人借 Tensor ...

  9. redis-3.0.1 sentinel 主从高可用 详细配置

    最近项目上线部署,要求redis作高可用,由于redis cluster还不是特别成熟,就选择了redis sentinel做高可用.redis本身有replication,实现主从备份.结合sent ...

  10. CSS 实现斑马条纹

    Part.1 linear-gradient() linear-gradient() 函数用于创建一个线性渐变的 "图像".为了创建一个线性渐变,你需要设置一个起始点和一个方向(指 ...