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

知识点

  • 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获取完整的代码,点击获取

Java 集合、数组排序的更多相关文章

  1. java 集合数组排序

    //数组排序Integer arr[] = {3,4,2};Arrays.sort(arr);//默认升序Arrays.sort(arr,Comparator.reverseOrder());//传一 ...

  2. Java集合---Array类源码解析

    Java集合---Array类源码解析              ---转自:牛奶.不加糖 一.Arrays.sort()数组排序 Java Arrays中提供了对所有类型的排序.其中主要分为Prim ...

  3. Java集合面试题

    1.Java集合框架是什么?说出一些集合框架的优点? 每种编程语言中都有集合,最初的Java版本包含几种集合类:Vector.Stack.HashTable和Array.随着集合的广泛使用,Java1 ...

  4. 40个Java集合面试问题和答案

    Java集合框架为Java编程语言的基础,也是Java面试中很重要的一个知识点.这里,我列出了一些关于Java集合的重要问题和答案. 另外,码农网之前也整理过一篇关于Java集合面试题的文章:大公司最 ...

  5. 40个Java集合面试问题和答案【下】【转载】

    接上文:http://www.cnblogs.com/xujianbo/p/5148083.html 28.哪些集合类是线程安全的? Vector.HashTable.Properties和Stack ...

  6. Java集合框架的知识总结(1)

    说明:先从整体介绍了Java集合框架包含的接口和类,然后总结了集合框架中的一些基本知识和关键点,并结合实例进行简单分析. 1.综述 所有集合类都位于java.util包下.集合中只能保存对象(保存对象 ...

  7. Java集合框架的知识总结

    说明:面试准备,写的挺不错的. 转载地址: http://www.cnblogs.com/zhxxcq/archive/2012/03/11/2389611.html 1.综述 所有集合类都位于jav ...

  8. Java 集合系列之一:JCF集合框架概述

    容器,就是可以容纳其他Java对象的对象.Java Collections Framework(JCF)为Java开发者提供了通用的容器 java集合主要划分为四个部分: Collection(Lis ...

  9. Java集合框架总结—超详细-适合面试

    Java集合框架总结—超详细-适合面试   一.精简: A.概念汇总 1.Java的集合类主要由两个接口派生而出:Collection和Map,Collection和Map是Java集合框架的根接口, ...

  10. (转)40个Java集合面试问题和答案

    Java集合框架为Java编程语言的基础,也是Java面试中很重要的一个知识点.这里,我列出了一些关于Java集合的重要问题和答案. 另外,码农网之前也整理过一篇关于Java集合面试题的文章:大公司最 ...

随机推荐

  1. 2)#ifndef和#pragma once

    #################################################################################################### ...

  2. 吴裕雄--天生自然python机器学习:使用Logistic回归从疝气病症预测病马的死亡率

    ,除了部分指标主观和难以测量外,该数据还存在一个问题,数据集中有 30%的值是缺失的.下面将首先介绍如何处理数据集中的数据缺失问题,然 后 再 利 用 Logistic回 归 和随机梯度上升算法来预测 ...

  3. Super Mario HDU - 4417 (主席树询问区间比k小的个数)

    Mario is world-famous plumber. His “burly” figure and amazing jumping ability reminded in our memory ...

  4. vue2.0学习之组件间通信

    /* child.vue*/ 子组件 <template> <div> /*必须要用div包裹起来,然后在里面写需要的组件内容,这里面和平常写的html是一样的*/ <d ...

  5. Java枚举的作用和用法

    从没有枚举的时代说起 在枚举出现之前,如果想要表示一组特定的离散值,往往使用一些常量.例如: [Java] 纯文本查看 复制代码 ? 01 02 03 04 05 06 07 08 09 10 11 ...

  6. Qt QString 与 QByteArray 的转换

    QString转换为QByteArray QByteArray byte; QString string; byte = string.toAscii(); QByteArray 转换为 QStrin ...

  7. PHP--foreach的问题

    <?php echo "<pre>"; $data = ['a', 'b', 'c']; foreach($data as $key => $val){ $ ...

  8. JS计算日期加天数后的日期(起始日期+有效天数=截至日期)

    /** * 优惠券有效期 * startDate:起始日期 * valueTime:有效天数 */ function transferCouponValueTime(startDate,valueTi ...

  9. 2018年宜賓美酒文化節浮空投影舞美特效 / 2018 Yibing Wine Festival Visual Effect Projection

    客户 Client:五粮液集团 硬件 Hardware:PC,巴可投影机30,000流明*2  Barco projector 30,000 lumen*2 软件 Software:Resolume, ...

  10. AI能帮我们造出一个无肉的世界吗?

    AI听起来很遥远,其实已经渗透到我们的日常工作和生活中.在不远的未来,互联网.大数据.硬件的发展和软件的优化,乃至全社会的参与,人工智能将真正从实验室走进生活,它将成为改变我们生活的一部分.我们吃的肉 ...