参考链接:

HOW2J.CN

前言

对于JAVA集合,都能够用集合的工具类Collections 提供的方法:

  1. Collections.sort(List list)
  2. Collections.sort(List list, Comparator c)

来进行排序。很多时候,集合中存储的不是基本的数据类型,而是我们自己定义的类的对象,我们希望用自己的排序方式对集合中的元素进行排序,我们可以通过让类实现Comparable接口来自定义排序方式,也可以采用创建匿名内部类的做法进行自定义排序

实现Comparable接口

  1. 让待排序的类继承Comparable接口,并实现compareTo方法(相当于给类提供了排序依据)

    package blog;
    
    /*
    * Student 类
    */
    public class Student implements Comparable<Student>{
    private String name;
    private int id;
    public Student(String name, int id) {
    this.name = name;
    this.id = id;
    }
    @Override
    public String toString() {
    return "Student [name=" + name + ", id=" + id + "]";
    }
    //实现对象比较的方法(id从小到大排序)
    @Override
    public int compareTo(Student o) {
    if(id < o.id)
    return -1;
    else
    return 1;
    }
    }
  2. 直接使用Collections.sort(List list)进行排序

    package blog;
    
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.List; public class Main {
    public static void main(String[] args) {
    List<Student> students = new ArrayList<Student>();
    students.add(new Student("xsy", 2));
    students.add(new Student("theory", 1));
    students.add(new Student("衍射",3)); //排序前
    System.out.println("排序前:");
    for(Student student : students) {
    System.out.println(student);
    } //排序后(按照id从小到大)
    Collections.sort(students);
    System.out.println("排序后:");
    for(Student student : students) {
    System.out.println(student);
    }
    }
    }

    排序前:

    Student [name=xsy, id=2]

    Student [name=theory, id=1]

    Student [name=衍射, id=3]

    排序后:

    Student [name=theory, id=1]

    Student [name=xsy, id=2]

    Student [name=衍射, id=3]

JAVA创建匿名内部类

类不需要继承接口,只需要在排序时重写Comparator的compare方法:

package blog;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List; public class Main {
public static void main(String[] args) {
List<Student> students = new ArrayList<Student>();
students.add(new Student("xsy", 2));
students.add(new Student("theory", 1));
students.add(new Student("衍射",3)); //排序前
System.out.println("排序前:");
for(Student student : students) {
System.out.println(student);
} //排序后(按照id从小到大)-- 重写Comparator的compare方法
Collections.sort(students, new Comparator() {
@Override
public int compare(Object o1, Object o2) {
if(o1 instanceof Student && o2 instanceof Student) {
Student s1 = (Student)o1;
Student s2 = (Student)o2;
return s1.getId()-s2.getId();
}
return 0;
}
});
System.out.println("排序后:");
for(Student student : students) {
System.out.println(student);
}
}
}

运行结果如下:

排序前:

Student [name=xsy, id=2]

Student [name=theory, id=1]

Student [name=衍射, id=3]

排序后:

Student [name=theory, id=1]

Student [name=xsy, id=2]

Student [name=衍射, id=3]

JAVA集合四:比较器--类自定义排序的更多相关文章

  1. java 集合Collections 工具类:排序,查找替换。Set、List、Map 的of方法创建不可变集合

    Collections 工具类 Java 提供1个操作 Set List Map 等集合的工具类 Collections ,该工具类里提供了大量方法对集合元素进行排序.查询和修改等操作,还提供了将集合 ...

  2. Java集合——Collections工具类

    Java集合——Collections工具类 摘要:本文主要学习了Collections工具类的常用方法. 概述 Collections工具类主要用来操作集合类,比如List和Set. 常用操作 排序 ...

  3. [Effective Java]第四章 类和接口

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  4. JAVA(四)类集/枚举

    成鹏致远 | lcw.cnblog.com |2014-02-04 JAVA类集 1.认识类集 类集的作用 类集实际上就是一个动态的对象数组,与一般的对象数组不同,类集中的对象内容可以任意扩充 类集的 ...

  5. java集合框架——工具类

    一.概述 JAVA集合框架中有两个很重要的工具类,一个是Collections,另一个是Arrays.分别封装了对集合的操作方法和对数组的操作方法,这些操作方法使得程序员的开发更加高效. public ...

  6. Java 集合的工具类Collections的常用方法

    Collections类 java.utils.Collections是集合工具类,用来对集合进行操作. Collections类的常用方法 这里介绍四个常用方法: addAll(Collection ...

  7. Java集合框架和数组的排序(转载)

    Java集合框架(*Collection)*和数组的排序 ​ 根据约定,在使用java编程的时候应尽可能的使用现有的类库,当然你也可以自己编写一个排序的方法,或者框架,但是有几个人能写得比JDK里的还 ...

  8. Java集合----Collection工具类

    Collections 工具类 Collections 是一个操作 Set.List 和 Map 等集合的工具类 Collections 中提供了大量方法对集合元素进行排序.查询和修改等操作,还提供了 ...

  9. JAVA 使用Comparator接口实现自定义排序

    1.原则 Comparator接口可以实现自定义排序,实现Comparator接口时,要重写compare方法: int compare(Object o1, Object o2) 返回一个基本类型的 ...

随机推荐

  1. TestLoader源码解析

    def loadTestsFromTestCase(self, testCaseClass) #看名称分析:从TestCase找测试集--那么就是把我们的def用例加载到testSuit里面 def ...

  2. 利用bat文件打开浏览器指定网页,提示 windows找不到chrome.exe。请确定文件名是否正确,再试一次 的解决经历

      1.在网上找到一些bat命令,原来电脑可以正常使用,效果就是执行后打开谷歌浏览器并全屏展示某网页,但是在昨天换个一个电脑后发现不能用了,提示以下截图的错误 2.找了半天发现问题所在: 把chrom ...

  3. 【Java思考】Java 中的实参与形参之间的传递到底是值传递还是引用传递呢?

    科普: 值传递(pass by value)是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数. 引用传递(pass by reference)是指在 ...

  4. hashcode和==

    public class Main { public static void main(String[] args) { Object o=new Object(); System.out.print ...

  5. Java深拷贝和浅拷贝的区别

    浅拷贝 被复制的对象的所有的变量都与原对象有相同的值,而所有的引用对象仍然指向原来的对象.换言之,浅拷贝 不复制引用对象. 1 class Experience { 2 private String ...

  6. android异步任务asyncTask详细分析

    android中的耗时操作需要放在子线程中去执行 asynctask是对Handler和和线程池的封装,直接使用比THread效率更加的高效因为封装了线程池,比我们每次直接new Thread效率更高 ...

  7. SpringMVC 学习笔记(五)

    47. 尚硅谷_佟刚_SpringMVC_文件上传.avi 参看博客https://www.cnblogs.com/hanfeihanfei/p/7931758.html相当的经典 我是陌生人关于Sp ...

  8. 9、ssh的集成方式2

    1.在第一种的集成方式中,通过struts2-spring-plugin-2.1.8.1.jar这个插件让spring自动产生对应需要的action类,不需要在对应的spring.xml文件中进行配置 ...

  9. Java Agent(上)

    1.java agent是什么? --->对用户透明,不侵入用户业务代码.让java虚拟机加载agent jar 2.java agent有什么用? --->应用场景例如:调用链追踪项目, ...

  10. .NET Core 选项模式【Options】的使用

    ASP.NET Core引入了Options模式,使用类来表示相关的设置组.简单的来说,就是用强类型的类来表达配置项,这带来了很多好处.利用了系统的依赖注入,并且还可以利用配置系统.它使我们可以采用依 ...