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. 持有对方的引用&&内部类

    现在来做个很简单的东西,就是做一个做加法的图形界面 然后现在先是一个不用持有对方引用的写法: import java.awt.*; import java.awt.event.*; public cl ...

  2. .net主站和二级域名下实现session共享

    public class CrossDomainCookie : IHttpModule { private string m_RootDomain = string.Empty; #region I ...

  3. iOS开发 - CoreData框架 数据持久化

    Core Data Core Data是iOS5之后才出现的一个框架,它提供了对象-关系映射(ORM)的功能,即能够将OC对象转化成数据,保存在SQLite数据库文件中,也能够将保存在数据库中的数据还 ...

  4. Angular 组件之间的传值

    第一种方法(传单个或者多个参数): 主页面方法: 先添加引用:private _routes: Router, Details(PBSCode) { this._routes.navigate(['p ...

  5. CentOS 7 挂载ntfs磁盘格式的U盘

    因为CentOS 默认不识别NTFS的磁盘格式,所以我们要借助另外一个软件来挂载,那就是ntfs-3g了 自带的yum源没有这个软件,要用第三方的软件源,这里我用的是阿里的epel. 1. 切换到系统 ...

  6. Java常用工具类---IP工具类、File文件工具类

    package com.jarvis.base.util; import java.io.IOException;import java.io.InputStreamReader;import jav ...

  7. 今天被 <!doctype html> 搞了两个小时,两个页面同样的样式,chosen右边的小箭头,一个上下居中对齐 一个居顶对齐。最后找到问题所在doctype

    今天被 <!doctype html> 搞了两个小时,两个页面同样的样式,chosen右边的小箭头,一个上下居中对齐 一个居顶对齐.最后找到问题所在doctype <-- 这个小箭头

  8. 了解Java密码扩展的基础

      了解Java密码扩展的基础     Java密码扩展(The Java Cryptography Extension),是JDK1.4的一个重要部分,基本上,他是由一些包构成的,这些包形成了一个框 ...

  9. mitmproxy 数据抓包

    1.安装环境: 基于python windows操作系统需要安装Microsoft Visual C++ V14.0以上 linux操作系统则直接基于python安装即可 2.安装mitmproxy ...

  10. echo追加字符串到文件末尾

    1.覆盖    echo  "string" >  filename 2.追加   echo "string"  >>  filename