前言:

1,实现Comparator接口的类的对象作为sort的入参

2,在方法的局部使用局部类

3,基于第二种方法,局部类改为匿名类

4,使用lamdba表达式->这种形式

5,借助Comparator和lamdba表达式多条件排序

6,调用方式和第五种有区别,原理一样

注:我以前是常用第1种,看了代码之后,觉得5,6种好一些

正文:

目标:按年龄从小到大排序

compareTo()方法:返回值为-1,第一个参数排前面;返回值为1,则第二个参数排前面;返回0按初始顺序排列

Comparator.comparing可以构造相反的排序:Comparator.comparing,见方法5

0,Java的实体bean结构

import java.util.ArrayList;
import java.util.List; public class Human {
private String name;
private int age; public Human() {
} public Human(String name, int age) {
this.name = name;
this.age = age;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} @SuppressWarnings("serial")
public static List<Human> getAInitHumanList() {
return new ArrayList<Human>() {
{
add(new Human("a", 12));
add(new Human("b", 10));
add(new Human("c", 12));
add(new Human("d", 28));
}
};
} @Override
public String toString() {
return this.getName() + ":" + this.getAge();
}
}

1,实现Comparator接口的类的对象作为sort的入参

其实就是自己先定义一个比较的方法,一般是把这个方法写在实体类里面

public class HumanComparetor implements Comparator<Human> {
@Override
public int compare(Human h1, Human h2) {
if (h1.getAge() > h2.getAge()) {
return 1;
} else if (h1.getAge() == h2.getAge()) {
return 0;
} else {
return -1;
}
}
}

调用

  public static void main(String[] args) {
List<Human> humans = Human.getAInitHumanList();
Collections.sort(humans, new HumanComparetor());
}

2,在方法的局部使用局部类

这样的格式看着就不太想用

    public static void main(String[] args) {
List<Human> humans = Human.getAInitHumanList();
//方法内-局部类
class HumanComparetor implements Comparator<Human> {
@Override
public int compare(Human h1, Human h2) {
return h1.getAge() - h2.getAge();
}
}
Collections.sort(humans, new HumanComparetor());
}

3,基于第二种方法,局部类改为匿名类

同上

    public static void main(String[] args) {
List<Human> humans = Human.getAInitHumanList();
//匿名类
Collections.sort(humans, new Comparator<Human>() {
@Override
public int compare(Human h1, Human h2) {
return h1.getAge() - h2.getAge();
}
});
}

4,使用lamdba表达式->这种形式

    public static void main(String[] args) {
List<Human> humans = Human.getAInitHumanList();
//lamdba 表达式 ->
Collections.sort(humans, (Human h1, Human h2) -> h1.getAge() - h2.getAge());
}

5,借助Comparator和lamdba表达式多条件排序

   public static void main(String[] args) {
List<Human> humans = Human.getAInitHumanList();
Collections.sort(humans, Comparator.comparing(Human::getAge).thenComparing(Human::getName));
System.out.println(humans);
}

结果:[b:10, a:12, c:12, d:28]

相反的排序

public static void main(String[] args) {
List<Human> humans = Human.getAInitHumanList();
Collections.sort(humans, Comparator.comparing(Human::getAge).thenComparing(Human::getName).reversed());
    System.out.println(humans);
}

结果:[d:28, c:12, a:12, b:10]

6,调用方式和第五种有区别,原理一样

  public static void main(String[] args) {
List<Human> humans = Human.getAInitHumanList();
//直接用list.sort
humans.sort(Comparator.comparing(Human::getAge).thenComparing(Human::getName));
}

参考博客:

1,java的list的几种排序写法整理(sort的用法) - 赫双炎 - CSDN博客
https://blog.csdn.net/heliangb46/article/details/77188939

2,Java中Collections.sort()排序详解 - 薛瑄的博客 - CSDN博客
https://blog.csdn.net/xx326664162/article/details/52227690/

3,Java:集合,对列表(List)中的自定义对象按属性(字段)排序(正序、倒序)的方法 - 那些年的事儿 - 博客园
https://www.cnblogs.com/nayitian/p/3322267.html

4,java list按照 对象 指定多个字段属性进行排序 - 羽林.Luouy - 博客园

https://www.cnblogs.com/Luouy/p/7159550.html

【Java】【11】String数组和List相互转换的更多相关文章

  1. JMeter脚本java代码String数组要写成String[] args,不能写成String args[],否则报错。

    JMeter脚本java代码String数组中括号要写在类型关键字后面,不能写在变量名后面.

  2. java代码-----String数组进行排序。是英文的字符串

    总结:主要是方法不同了.是compareTo()方法比较字符串大小 package com.s.x; import java.util.Arrays; public class Jay { publi ...

  3. java中String数组和List的互相转化

    1.List转String数组 方法一: //先准备一个List List<String> testList=new ArrayList<>(); testList.add(& ...

  4. Java从string数组创建临时文件

    //从string数组创建临时文件 private static File createSampleFile(String[] strs) throws IOException { File file ...

  5. java中的数组与集合相互转换

    1.数组转换成集合 数组转换为集合,用Arrays.asList方法. public static void main(String[] args) { String[] arr = {"a ...

  6. java判断string数组中是否包含某个元素

  7. Java-Runoob-高级教程-实例-数组:11. Java 实例 – 删除数组元素

    ylbtech-Java-Runoob-高级教程-实例-数组:11. Java 实例 – 删除数组元素 1.返回顶部 1. Java 实例 - 删除数组元素  Java 实例 以下实例演示了如何使用 ...

  8. 纯数据结构Java实现(1/11)(动态数组)

    我怕说这部分内容太简单后,突然蹦出来一个大佬把我虐到哭,还是悠着点,踏实写 大致内容有: 增删改查,泛型支持,扩容支持,复杂度分析.(铺垫: Java语言中的数组) 基础铺垫 其实没啥好介绍的,顺序存 ...

  9. NDK(14)Native的char*和Java的String相互转换

    转自: http://www.cnblogs.com/canphp/archive/2012/11/13/2768937.html 首先确保C/C++源文件的字符编码是UTF-8与JAVA的class ...

随机推荐

  1. Running ROS on Windows 10

    1.在Windows10下安装ROS.需要开启WSL.参考 2.修改ubuntu国内源,可以提高安装包下载更新速度. (1)原文件备份:sudo cp /etc/apt/sources.list /e ...

  2. Spring boot 源码分析(前言)

    开坑达人 & 断更达人的我又回来了 翻译的坑还没填完,这次再开个新坑= = 嗯,spring boot的源码分析 本坑不打算教你怎么用spring boot = = 也不打算跟你讲这玩意多方便 ...

  3. 关于element组件中分页的一些个人思路

    最近在用element,用到了它的分页这个组件,我这边的情况是,我前端请求数据,数据大概有20个的样子,把数据存在data的一个数组里面,用一个v-for循环遍历数组内容,并用div装起来,这样20个 ...

  4. OpenCV学习笔记(二) - 写入视频、jpg格式

    写入视频: import sys, os import cv2 imgDir = '/Users/xxx/salient/' videoName = 'vname' fps = 30 #帧频 outp ...

  5. VDSR

    提出SRCNN问题 context未充分利用 Convergence 慢 Scale Factor 训练指定fator的模型再重新训练其他fator的模型低效 context 对于更大的scale-f ...

  6. Python中自定义filter用法

    django中新建项目,在项目中新建app,自定义filter一般放到app中.结构目录如下: 1.先在APP中新建一个templatetags的django文件夹,文件夹中新建一个filter的py ...

  7. context使用

    1. 概述 go语言中goroutine之间的关联关系,缺乏维护,在erlang中有专门的机制来保障新开协程的生命周期,在go语言中,只能通过channel + select来实现,但不够直观,很绕. ...

  8. Hessian序列化的一个潜在问题

    一. 最近的用rpc框架的时候,当用hessian序列化对象是一个对象继承另外一个对象的时候,当一个属性在子类和有一个相同属性的时候,反序列化后子类属性总是为null. 二. 示例代码: DTO对象 ...

  9. 基于OpenCV做“三维重建”(2)--封装标定过程

    既然已经能够找到了标定点,那么下边的工作就是使用标定结果了.[这本书在这里的内容组织让人莫名其妙]但是通过阅读代码能够很方便地串起来. /*------------------------------ ...

  10. 7-27 Codeforces Round #499 (Div. 2)

    C. Fly 链接:http://codeforces.com/group/1EzrFFyOc0/contest/1011/problem/C 题型:binary search .math. 题意:总 ...