在平时开发的过程中,经常会遇到需要对数组、集合中元素按规则进行排序,本文记录在开发过程中可能遇到的情况以及相关的完整代码示例。

知识点

  • Comparable<T>接口

    实现了该接口的对象,必须重写compareTo方法,对象实现了该接口,则该对象具有排序功能,比如String、Integer等。
  • Comparator<T>接口

    要实现自定义排序器的时候,需要实现该接口。当某个类不具备排序功能或者已有的排序功能不足以支撑你需求的时候,就是自定义排序器登场的时候了。比如String内置的排序实现按字符顺序排序,那我想按字符串长度排序咋办呢?这时就可以自定义实现Comparator的对象了。
  • 数组(比如String[])排序使用Arrays.sort
  • 集合(比如List<T>)排序使用Collections.sort

实例

1. 默认String排序示例

1.1 数组排序用法

String[] strArr = new String[]{"zhangsan","lisi","wangwu"};
//数组默认按字符升序排序
Arrays.sort(strArr);
System.out.println("默认按字母升序排序:");
for (String str:strArr) {
System.out.println(str);
}

1.2 集合排序用法

List<String> strList = new ArrayList<>();
strList.add("zhangsan");
strList.add("lisi");
strList.add("wangwu");
//集合默认按字符升序排序
Collections.sort(strList);
System.out.println("默认按字母升序排序:");
for (String str:strList) {
System.out.println(str);
}
  • 以上两个例子都是输出:

2.自定义排序器,String数组按字符串长度倒序

  • 创建自定义排序器StringComparator
package com.simon.interfacedemo.sortdemo.stringdemo;

import java.util.Comparator;
/**
* @Description: 通过实现Comparator接口,实现自定义排序
*/
public class StringComparator implements Comparator<String>{
/**
* 按字符串长度降序排序
*/
@Override
public int compare(String o1, String o2) {
return o1.length() > o2.length() ? -1 : 1;
}
}

2.1 数组使用StringComparator排序器

String[] strArr = new String[]{"zhangsan","lisi","wangwu"};
//自定义排序,按字符串长度升序
Arrays.sort(strArr,new StringComparator());
System.out.println("自定义排序,按字符串长度降序排序:");
for (String str:strArr) {
System.out.println(str);
}

2.2 集合使用StringComparator排序器

List<String> strList = new ArrayList<>();
strList.add("zhangsan");
strList.add("lisi");
strList.add("wangwu");
//自定义排序,按字符串长度降序
Collections.sort(strList,new StringComparator());
System.out.println("自定义排序,按字符串长度降序排序:");
for (String str:strList) {
System.out.println(str);
}
  • 以上两个例子都是输出:

3.自定义类实现Comparable接口,使类具有排序功能

  • 自定义Student类,实现Comparable接口,重写compareTo方法,按age升序排序
public class Student implements Comparable<Student>{

    private String name;
private Integer age; public Student(String name,Integer age){
this.name = name;
this.age = age;
} public String getName() {
return name;
} /**
* 实现compareTo接口方法,按age升序。
* @param o
* @return 返回1:大于,0:等于,-1:小于
*/
@Override
public int compareTo(Student o) {
return Integer.compare(age,o.age);
} /**
* 重写toString方法,方便System.out.println打印出详细的信息。
*/
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}

3.1 Student数组按age升序排序

Student[] students = new Student[3];
students[0] = new Student("zhangsan",30);
students[1] = new Student("lisi",28);
students[2] = new Student("wangwu",33); System.out.println("通过student实现的默认排序,根据age升序排序:");
Arrays.sort(students);
for (Student student : students) {
System.out.println(student);
}

3.2 Student集合按age升序排序

List<Student> studentList = new ArrayList<>();
studentList.add(new Student("zhangsan",30));
studentList.add(new Student("lisi",28));
studentList.add(new Student("wangwu",33));
System.out.println("通过student实现的默认排序,根据age升序排序:");
Collections.sort(studentList);
for (Student student : studentList) {
System.out.println(student);
}
  • 以上两个例子都是输出:

4.自定义排序器,按Student的name长度升序排序

  • 创建自定义排序器StudentComparator
package com.simon.interfacedemo.sortdemo.studentdemo;

import java.util.Comparator;
/**
* @Description: 通过实现Comparator接口,实现自定义排序
*/
public class StudentComparator implements Comparator<Student>{
/**
* 按名字长度升序排序
*/
@Override
public int compare(Student o1, Student o2) { return o1.getName().length() > o2.getName().length() ? 1 : -1;
}
}

4.1 数组使用StudentComparator排序器

Student[] students = new Student[3];
students[0] = new Student("zhangsan",30);
students[1] = new Student("lisi",28);
students[2] = new Student("wangwu",33); System.out.println("通过自定义排序器实现的排序,根据名字长度排序:");
Arrays.sort(students,new StudentComparator());
for (Student student : students) {
System.out.println(student);
}

4.2 集合使用StudentComparator排序器

List<Student> studentList = new ArrayList<>();
studentList.add(new Student("zhangsan",30));
studentList.add(new Student("lisi",28));
studentList.add(new Student("wangwu",33)); System.out.println("通过自定义排序器实现的排序,根据名字长度排序:");
Collections.sort(studentList,new StudentComparator());
for (Student student : students) {
System.out.println(student);
}
  • 以上两个例子都是输出:

后续

  • 以上列出了实际开发中可能用到的数组、集合的排序方式。使用lambda还可以更简化,后续再总结出来。
  • 以上示例都可以通过我的GitHub获取完整的代码,点击获取

最新文章

  1. postman使用之五:Runner的使用
  2. MATLAB神经网络原理与实例精解视频教程
  3. JavaScript+HTML,简单的计算器实现
  4. 使用PhoneGap搭建一个山寨京东APP
  5. javascript改变样式(cssFloat,styleFloat)
  6. jdk 1.5新特性说明
  7. Sublime Text 2.0.2 注册码
  8. Java命令学习系列(7):Javap(转)
  9. Android Material各种颜色设置
  10. CCRenderBuffer初始化中的render state参数
  11. 【Idea】IntelliJ不停地updating indices的解决办法
  12. select option 选中 取消js
  13. 记一次vcsa6修复过程
  14. spring整合mybatis在使用.properties文件时候遇到的问题
  15. Lintcode455-StudentID-Easy
  16. django+xadmin+echarts实现数据可视化
  17. 使用自定义的Adapter来设置ListView的内容
  18. Eclipse Photon没有Server选项的问题
  19. 安装OWA2013
  20. [codeforces/edu5]总结(F)

热门文章

  1. 吴裕雄--天生自然python学习笔记:python 用pygame模块动画一让图片动起来
  2. locate及find查找命令
  3. Windows_Management_Instrumentation
  4. asp.net 管道处理模式
  5. python语法基础-面向对象-基础-长期维护
  6. Java IO: 字符流的Buffered和Filter
  7. JavaScript学习总结(五)原型和原型链详解
  8. yum命令不能使用的解决办法
  9. Android开发之《ffmpeg解码mjpeg视频流》
  10. Mac下如何使用homebrew