详解java Collections.sort的两种用法

Collections是一个工具类,sort是其中的静态方法,是用来对List类型进行排序的,它有两种参数形式:

 public static <T extends Comparable<? super T>> void sort(List<T> list) {
    list.sort(null);
  }
 public static <T> void sort(List<T> list, Comparator<? super T> c) {
    list.sort(c);
  }

首先使用基本类型(此处使用Integer)来演示第一个方法:

static List<Integer> intList = Arrays.asList(2, 3, 1);
private static void sortBaseTypeByDefaultMode() {
    System.out.println("before sort:");
    PrintUtil.showList(intList);
    System.out.println("=========================");
    Collections.sort(intList);
    System.out.println("after sort:");
    PrintUtil.showList(intList);
  }

PrintUtil.showList是自定义的一个打印List类型的方法,此处只关心输出结果就行,如下:

可以看到,默认的排序是正序,那么如何实现逆序呢,这就要使用第二种方式了,即通过实现Comparator接口的compare方法来完成自定义排序,代码如下:

private static void sortBaseTypeByIDefineMode() {
    System.out.println("before sort:");
    PrintUtil.showList(intList);
    System.out.println("=========================");
    Collections.sort(intList,new Comparator<Integer>() {

      @Override
      public int compare(Integer o1, Integer o2) {
        // 返回值为int类型,大于0表示正序,小于0表示逆序
        return o2-o1;
      }
    });
    System.out.println("after sort:");
    PrintUtil.showList(intList);
  }

可以看到,已经实现了逆序的排序了。

接下来看看自定义类的排序:

定义一个Emp类:

public class Emp{
  private int empno;
  private String ename;
  public int getEmpno() {
    return empno;
  }
  public void setEmpno(int empno) {
    this.empno = empno;
  }
  public String getEname() {
    return ename;
  }
  public void setEname(String ename) {
    this.ename = ename;
  }

  public Emp(int empno, String ename) {
    super();
    this.empno = empno;
    this.ename = ename;
  }
  @Override
  public String toString()
  {
    return "empno:\t"+empno+"\tename:\t"+ename;
  }
}

首先使用同样的方式来使用Collections.sort方法:

定义泛型违Emp类型的List:

static List<Emp> empList;
  static
  {
    Emp emp1 = new Emp(2,"Guan YunChang");
    Emp emp2 = new Emp(3,"Zhang Fei");
    Emp emp3 = new Emp(1,"Liu Bei");
    empList = Arrays.asList(emp1,emp2,emp3);
  }

对empList进行排序:

此时会报错:

The method sort(List<T>) in the type Collections is not applicable for the arguments (List<Emp>)

意思是参数类型为List<Emp>时,sort方法无法执行,原因是泛型没有继承Comparable接口,这种方式稍后再说,我们先使用sort方法的第二种形式:

private static void sortEmpByIDefineMode()
  {
    System.out.println("before sort:");
    PrintUtil.showList(empList);
    System.out.println("=========================");
    Collections.sort(empList,new Comparator<Emp>() {

      @Override
      public int compare(Emp o1, Emp o2) {
        /*按员工编号正序排序*/
        return o1.getEmpno()-o2.getEmpno();
        /*按员工编号逆序排序*/
        //return o2.getEmpno()-o1.getEmpno();
        /*按员工姓名正序排序*/
        //return o1.getEname().compareTo(o2.getEname());
        /*按员工姓名逆序排序*/
        //return o2.getEname().compareTo(o1.getEname());
      }
    });
    System.out.println("after sort:");
    PrintUtil.showList(empList);
  }

运行结果:

根据不同的排序方式即可呈现不同的结果。

接下来看看第一种形式的实现,首先让Emp类继承Comparable接口并重写compareTo方法(为了和上面的排序方式区别开,此次按照员工姓名逆序排列):

public class Emp implements Comparable<Emp>{

  /*属性、getter/setter方法、toString方法及构造方法略*/
  @Override
  public int compareTo(Emp emp) {
    /*按员工编号正序排序*/
    //return this.getEmpno()-emp.getEmpno();
    /*按员工编号逆序排序*/
    //return emp.getEmpno()-this.getEmpno();
    /*按员工姓名正序排序*/
    //return this.getEname().compareTo(emp.getEname());
    /*按员工姓名逆序排序*/
    return emp.getEname().compareTo(this.getEname());
  }
}

使用Collections.sor方法的第一种形式实现:

private static void sortEmpByDefaultMode()
  {
    System.out.println("before sort:");
    PrintUtil.showList(empList);
    System.out.println("=========================");
    Collections.sort(empList);
    System.out.println("after sort:");
    PrintUtil.showList(empList);
  }

运行结果:

总结:

1.对于String或Integer这些已经实现Comparable接口的类来说,可以直接使用Collections.sort方法传入list参数来实现默认方式(正序)排序;

2.如果不想使用默认方式(正序)排序,可以通过Collections.sort传入第二个参数类型为Comparator来自定义排序规则;

3.对于自定义类型(如本例子中的Emp),如果想使用Collections.sort的方式一进行排序,可以通过实现Comparable接口的compareTo方法来进行,如果不实现,则参考第2点;

4.jdk1.8的Comparator接口有很多新增方法,其中有个reversed()方法比较实用,是用来切换正序和逆序的,代码如下:

private static void sortEmpByIDefineMode()
  {
    System.out.println("before sort:");
    PrintUtil.showList(empList);
    System.out.println("=========================");
    Comparator<Emp> comparator = new Comparator<Emp>() {

      @Override
      public int compare(Emp o1, Emp o2) {
        /*按员工编号正序排序*/
        return o1.getEmpno()-o2.getEmpno();
        /*按员工编号逆序排序*/
        //return o2.getEmpno()-o1.getEmpno();
        /*按员工姓名正序排序*/
        //return o1.getEname().compareTo(o2.getEname());
        /*按员工姓名逆序排序*/
        //return o2.getEname().compareTo(o1.getEname());
      }

    };

    /*新的逆序实现方式*/
    Collections.sort(empList,comparator.reversed());
    System.out.println("after sort:");
    PrintUtil.showList(empList);
  }

复写的compare方法定义的是按员工编号正序排序,在使用reversed翻转后结果如下:

这样就使得排序规则的切换更为方便了。

到此这篇关于详解java Collections.sort的两种用法的文章就介绍到这了,更多相关java Collections.sort用法内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 用Java集合中的Collections.sort方法如何对list排序(两种方法)

    第一种是list中的对象实现Comparable接口,如下: /** * 根据order对User排序 */ public class User implements Comparable <user> { private String name; private Integer order; public String getName() { return name; } public void setName(String name) { this.name = name; } publi

  • Java Collections.sort()排序代码案例

    1.案例: Person对象(名字,id,年龄) 要求按照,年龄从小到大排序,年龄相等,按照名字的字典顺序de倒序排序 2.案例设计: 1)使用ArrayList存储Person对象, 2)利用Collections.sort()进行排序 3)输出结果 3.代码分享: package CollectionDemo; import java.util.ArrayList; import java.util.Collections; import java.util.List; import jav

  • Java Collections.sort()实现List排序的默认方法和自定义方法

    1.java提供的默认list排序方法 主要代码: List<String> list = new ArrayList();list.add("刘媛媛"); list.add("王硕"); list.add("李明"); list.add("刘迪"); list.add("刘布"); //升序 Collections.sort(list,Collator.getInstance(java.uti

  • JAVA对list集合进行排序Collections.sort()

    对一个集合中的对象进行排序,根据对象的某个指标的大小进行升序或降序排序.代码如下: 进行降序排列 进行降序排列 Collections.sort(list, new Comparator<ResultTypeDesc>() { public int compare(ResultTypeDesc o1, ResultTypeDesc o2) { return o2.getRatio().compareTo(o1.getRatio()); } }); 进行升序排列 Collections.sort

  • java中Collections.sort排序函数用法详解

    Comparator是个接口,可重写compare()及equals()这两个方法,用于比价功能:如果是null的话,就是使用元素的默认顺序,如a,b,c,d,e,f,g,就是a,b,c,d,e,f,g这样,当然数字也是这样的. compare(a,b)方法:根据第一个参数小于.等于或大于第二个参数分别返回负整数.零或正整数. equals(obj)方法:仅当指定的对象也是一个 Comparator,并且强行实施与此 Comparator 相同的排序时才返回 true. Collections.

  • Java Arrays.sort和Collections.sort排序实现原理解析

    1.使用 排序 2.原理 事实上Collections.sort方法底层就是调用的array.sort方法,而且不论是Collections.sort或者是Arrays.sort方法, 跟踪下源代码吧,首先我们写个demo public static void main(String[] args) { List<String> strings = Arrays.asList("6", "1", "3", "1",

  • 详解Java中Collections.sort排序

    Comparator是个接口,可重写compare()及equals()这两个方法,用于比价功能:如果是null的话,就是使用元素的默认顺序,如a,b,c,d,e,f,g,就是a,b,c,d,e,f,g这样,当然数字也是这样的. compare(a,b)方法:根据第一个参数小于.等于或大于第二个参数分别返回负整数.零或正整数. equals(obj)方法:仅当指定的对象也是一个 Comparator,并且强行实施与此 Comparator 相同的排序时才返回 true. Collections.

  • java中Collections.sort排序详解

    Comparator是个接口,可重写compare()及equals()这两个方法,用于比价功能:如果是null的话,就是使用元素的默认顺序,如a,b,c,d,e,f,g,就是a,b,c,d,e,f,g这样,当然数字也是这样的. compare(a,b)方法:根据第一个参数小于.等于或大于第二个参数分别返回负整数.零或正整数. equals(obj)方法:仅当指定的对象也是一个 Comparator,并且强行实施与此 Comparator 相同的排序时才返回 true. Collections.

  • 详解java Collections.sort的两种用法

    Collections是一个工具类,sort是其中的静态方法,是用来对List类型进行排序的,它有两种参数形式: public static <T extends Comparable<? super T>> void sort(List<T> list) { list.sort(null); } public static <T> void sort(List<T> list, Comparator<? super T> c) {

  • 详解java调用python的几种用法(看这篇就够了)

    java调用python的几种用法如下: 在java类中直接执行python语句 在java类中直接调用本地python脚本 使用Runtime.getRuntime()执行python脚本文件(推荐) 调用python脚本中的函数 准备工作: 创建maven工程,结构如下: 到官网https://www.jython.org/download.html下载Jython的jar包或者在maven的pom.xml文件中加入如下代码: <dependency> <groupId>org

  • 详解Java合并数组的两种实现方式

    最近在写代码时遇到了需要合并两个数组的需求,突然发现以前没用过,于是研究了一下合并数组的方式,总结如下. 1.System.arraycopy()方法 (1) 解析 通过阅读JDK源码,我可以知道方法原型如下: public static native void arraycopy(Object src, int srcPos, Object dest, int destPos, int length); 其中: src是源数组 srcPos是源数组复制的起始位置 dest是目标数组 destP

  • 详解Java中super的几种用法并与this的区别

    1. 子类的构造函数如果要引用super的话,必须把super放在函数的首位 复制代码 代码如下: class Base { Base() { System.out.println("Base"); } } public class Checket extends Base { Checket() { super();//调用父类的构造方法,一定要放在方法的首个语句 System.out.println("Checket"); } public static voi

  • 详解Nginx 和 PHP 的两种部署方式的对比

    详解Nginx 和 PHP 的两种部署方式的对比 2种部署方式简介 第一种 前置1台nginx服务器做HTTP反向代理和负载均衡 后面N太服务器的Nginx做Web服务,并调用php-fpm提供的fast cgi服务 此种部署方式最为常见,web服务和PHP服务在同一台服务器上都有部署 第二种 前置1台nginx服务器做Web服务 后面服务器只部署php-fpm服务,供nginx服务器调用 前置1台nginx服务器,在调用后面多例php-fpm服务时,也可以做到负载均衡 如下图 : 对比 从系统

  • 详解Java内存溢出的几种情况

    JVM(Java虚拟机)是一个抽象的计算模型.就如同一台真实的机器,它有自己的指令集和执行引擎,可以在运行时操控内存区域.目的是为构建在其上运行的应用程序提供一个运行环境.JVM可以解读指令代码并与底层进行交互:包括操作系统平台和执行指令并管理资源的硬件体系结构. 1. 前言 JVM提供的内存管理机制和自动垃圾回收极大的解放了用户对于内存的管理,大部分情况下不会出现内存泄漏和内存溢出问题.但是基本不会出现并不等于不会出现,所以掌握Java内存模型原理和学会分析出现的内存溢出或内存泄漏,对于使用J

  • 详解Java创建线程的五种常见方式

    目录 Java中如何创建线程呢? 1.显示继承Thread,重写run来指定现成的执行代码. 2.匿名内部类继承Thread,重写run来执行线程执行的代码. 3.显示实现Runnable接口,重写run方法. 4.匿名内部类实现Runnable接口,重写run方法 5.通过lambda表达式来描述线程执行的代码 [面试题]:Thread的run和start之间的区别? Thread类的具体用法 Thread类常见的一些属性 中断一个线程 1.方法一:让线程run完 2.方法二:调用interr

  • 详解IOS 单例的两种方式

    详解IOS 单例的两种方式 方法一: #pragma mark - #pragma mark sharedSingleton methods //单例函数 static RtDataModel *sharedSingletonManager = nil; + (RtDataModel *)sharedManager { @synchronized(self) { if (sharedSingletonManager == nil) { sharedSingletonManager = [[sel

  • 详解Swift model 解析的两种方法

    详解Swift model 解析的两种方法 1. 常规解析方法 //懒加载声明一个LJNewsModel为数据的数组 lazy var ljArray : [LJNewsModel] = [LJNewsModel]() //MARK:-- 数据获取和解析 extension NewsViewController{ func requestNetData(){ /* 打印json数据 */ LJDownLoadNetImage.request("GET", url: "http

  • 详解Java停止线程的四种方法

    一.线程停止基础知识 interrupted(): 测试当前线程是否已经中断.该方法为静态方法,调用后会返回boolean值.不过调用之后会改变线程的状态,如果是中断状态调用的,调用之后会清除线程的中断状态. isInterrupted(): 测试线程是否已经中断.该方法由对象调用 interrupt(): 标记线程为中断状态,不过不会中断正在运行的线程. stop(): 暴力停止线程.已弃用. 二.停止线程方法1:异常法停止 线程调用interrupt()方法后,在线程的run方法中判断当前对

随机推荐