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. [转]C#Linq中的Union All/Union/Intersect和Top/Bottom和Paging和SqlMethods,skip,take,takewhile,skipwhile,编译查询等

    本文转自:http://www.cnblogs.com/suizhikuo/p/3791799.html 我们继续讲解LINQ to SQL语句,这篇我们来讨论Union All/Union/Inte ...

  2. .NET框架概述

    .NET战略目标: 任何时候(when),任何地方(where),使用任何工具(what)都能通过.NET的服务获得网络上的任何信息. .NET优势: 1.提供了一个面向对象的编程环境,完全支持面向对 ...

  3. Oracle 表-初步涉水不深(第一天)

    oracle 关系型数据库 注释:面对大型数据处理,市场占有率40%多(但是目前正往分布式转换) 故事:本来一台大型计算机才能处理的数据,美国科学家用100台家用电脑连接,成功处理了数据.. tabl ...

  4. c语言-依赖倒转

    当一个文件(aa.c文件)依赖于头文件(bb.h)时,如果bb.c编译之后形成的bb.o文件重新编译后,aa.o的文件不需要重新编译 aa.c文件: bb.h文件:对bb.c文件进行声明 bb.c文件 ...

  5. Struts2------拦截器和标签库和注解开发

    一.解析Struts2源码中拦截器的执行 客户端请求Action,执行前端控制器,在前端控制器内部创建了Action的代理类,调用代理类的execute方法,在execute方法内部执行ActionI ...

  6. JavaScript——max-age

    https://zhidao.baidu.com/question/391047416053664205.html 页面优化方式之一,延长过期时间.默认max-age=0

  7. Win7 32位 遇到微软 silverlight 5.0安装失败的解决办法

    刚开始,也是尝试下载安装,多次都是到99%,提示安装失败! 也查找了很多网上朋友分享的办法,还是不行.重新建立一个管理员账号,还是不行. 后来反复不断的测试,找到原因了,安装99%不成功,但是卸载程序 ...

  8. Net作业调度

    Net作业调度(一) -Quartz.Net入门 2014-11-01 13:14 by 蘑菇先生, 13954 阅读, 7 评论, 收藏, 编辑 背景 很多时候,项目需要在不同时刻,执行一个或很多个 ...

  9. myslq 5.7 root 默认密码

    sudo sumysqld_safe --skip-grant-tables --skip-networking & UPDATE mysql.user SET password=PASSWO ...

  10. java规范与标准?

    所谓规范,即指由很多人同时遵守的行为或理论. java的规范并不是指其中一种,而是有很多种,比如java编码规范,java命名规范,java虚拟机规范等等,甚至于一个编码规范都有很多种,不同的公司.组 ...