盘点Java中的排序操作方案

盘点Java中的排序操作方案

Comparable 接口-自然排序

  1. 类implements Comparable接口

  2. 类重写 public int compareTo(Object obj)方法

  • 如果返回值为正数,则表示当前对象(调用该方法的对象)比 obj 对象“大”;反之“小”;如果为零的话,则表示两对象相等
 public class Student implements Comparable {  private int id;  private String name;  public Student() {  super();  }  @Override  public int compareTo(Object obj) {  if (obj instanceof Student) {  Student stu = (Student) obj;  return id - stu.id;  }  return 0;  }  @Override  public String toString() {  return "<" + id + ", " + name + ">";  }  } 
  1. 使用 Arrays 的 sort 方法 对类的对象实例数组 进行排序

Comparator 比较器排序

法1

Arrays.sort方法的参数中增加一个匿名内部类new Comparator(){},在该Comparator中重写public int compare(Object o1, Object o2)方法,指定按xxx排序

	Arrays.sort(stus, 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(); // 按Id排  return s1.getName().compareTo(s2.getName()); // 按姓名排  }  return 0;  }  });  

法2

使用TreeSet并指定匿名内部类new Comparator(){},最后把 多个要排序的对象item 添加到 TreeSet中,再打印TreeSet,即得到排序后的数据

	 Student stu1 = new Student(1, "Little");  Student stu2 = new Student(2, "Cyntin");  Student stu3 = new Student(3, "Tony");  Student stu4 = new Student(4, "Gemini");  SortedSet set = new TreeSet(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.getName().compareTo(s2.getName());  }  return 0;  }     });  set.add(stu1);  set.add(stu3);   set.add(stu2);  set.add(stu4);  System.out.println(set);

java.util.Collections 工具类

Collections.sort(集合,匿名内部类)方式

 public class Main {  public static void main(String[] args) {  List<Person> people = new ArrayList<>();  // 添加一些 Person 对象到 people List ...  // 使用自定义的 Comparator 对 people List 进行排序  Collections.sort(people, new Comparator<Person>() {  @Override  public int compare(Person p1, Person p2) {  return p1.getAge() - p2.getAge(); // 按年龄升序排序  }  });  // 打印排序后的 List ...  }  }

lambda 表达式方式

Collections.sort(people, (p1, p2) -> p1.getAge() - p2.getAge());

Collections.reverse 反转排序(把一个排好顺序的集合进行反转)

int[] array = {1, 2, 3, 4, 5};  
List<Integer> list = Arrays.asList(array); // 注意:这里会返回一个固定大小的List,不支持add/remove操作  
// 由于Arrays.asList返回的List是固定大小的,所以我们不能直接反转它  
// 但可以创建一个新的ArrayList并反转它  
List<Integer> arrayList = new ArrayList<>(Arrays.asList(array));  
Collections.reverse(arrayList);  
// 如果你需要将ArrayList转回数组  
int[] reversedArray = arrayList.stream().mapToInt(Integer::intValue).toArray();

调用Comparator.reverseOrder()反转排序

 import java.util.ArrayList;  import java.util.Collections;  import java.util.Comparator;  import java.util.List;  import java.util.Random;  public class SortIntegers {  public static void main(String[] args) {  List<Integer> numbers = new ArrayList<>();  // 生成10个随机整数  Random random = new Random();  for (int i = 0; i < 10; i++) {  numbers.add(random.nextInt(100)); // 假设随机数的范围是0到99  }  // 打印原始列表  System.out.println("原始列表:");  for (Integer number : numbers) {  System.out.print(number + " ");  }  System.out.println();  // 升序排序并打印  Collections.sort(numbers);  System.out.println("升序排序后的列表:");  for (Integer number : numbers) {  System.out.print(number + " ");  }  System.out.println();  // 降序排序并打印  Collections.sort(numbers, Comparator.reverseOrder());  System.out.println("降序排序后的列表:");  for (Integer number : numbers) {  System.out.print(number + " ");  }  System.out.println();  }  
}

java8stream写法

集合.sort()方法

List<Person> people = Arrays.asList(new Person("Alice", 25), new Person("Bob", 20), new Person("Charlie", 30));  
people.sort((p1, p2) -> p1.getAge() - p2.getAge()); // 按年龄升序排序  
System.out.println(people); // 输出按年龄排序后的人员列表

自定义排序(使用方法引用)

// 假设Person类有一个静态方法用于比较年龄  public static int compareByAge(Person p1, Person p2) {  return p1.getAge() - p2.getAge();  }  List<Person> people = ...; // 初始化人员列表  
people.sort(Person::compareByAge); // 使用方法引用进行排序

排序时处理空值或特殊情况

 List<String> strings = Arrays.asList("apple", null, "banana", "", "cherry");  
strings.sort((s1, s2) -> {  if (s1 == null && s2 == null) return 0;  if (s1 == null) return 1;  if (s2 == null) return -1;  if (s1.isEmpty() && s2.isEmpty()) return 0;  if (s1.isEmpty()) return 1;  if (s2.isEmpty()) return -1;  return s1.compareTo(s2);  
});  
System.out.println(strings); // 输出排序后的字符串列表,空值和空字符串被放在后面

使用jdframe框架

引入依赖

 <dependency><groupId>io.github.burukeyou</groupId><artifactId>jdframe</artifactId><version>0.0.2</version></dependency>

使用内部的排序API

  • 准备集合数据
	static List<Student> studentList = new ArrayList<>();static {studentList.add(new Student(1,"a","一中","一年级",11, new BigDecimal(1)));studentList.add(new Student(2,"a","一中","一年级",11, new BigDecimal(1)));studentList.add(new Student(3,"b","一中","三年级",12, new BigDecimal(2)));studentList.add(new Student(4,"c","二中","一年级",13, new BigDecimal(3)));studentList.add(new Student(5,"d","二中","一年级",14, new BigDecimal(4)));studentList.add(new Student(6,"e","三中","二年级",14, new BigDecimal(5)));studentList.add(new Student(7,"e","三中","二年级",15, new BigDecimal(5)));
}
  • 可以多重排序
	 // 等价于 order by age desc
SDFrame.read(studentList).sortDesc(Student::getAge);
//  等价于 order by age desc, level asc
SDFrame.read(studentList).sortDesc(Student::getAge).sortAsc(Student::getLevel);
// 等价于 order by age asc
SDFrame.read(studentList).sortAsc(Student::getAge);
// 使用Comparator 排序
SDFrame.read(studentList).sortAsc(Comparator.comparing(e -> e.getLevel() + e.getId()));

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/14326.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

多家知名媒体到访“光子1号金融算力中心“ 交流AI与算力未来观

5月23日&#xff0c;企商在线 “光子1号金融算力中心媒体参观日”活动成功举办&#xff0c;十多家主流媒体、IT行业媒体及自媒体代表走进光子1号金融算力中心&#xff0c;深入了解企商业务发展、战略规划及“光子1号金融算力中心”等企商打造的新型数字基础设施&#xff0c;共同…

Python条件分支与循环

大家好&#xff0c;当涉及到编写高效和灵活的程序时&#xff0c;条件分支和循环是 Python 中至关重要的概念。它们允许我们根据不同的条件执行不同的代码块&#xff0c;或者重复执行一组语句。条件分支和循环是测试开发工程师在日常工作中经常使用的工具&#xff0c;无论是编写…

光耦合器的特性和应用概述

光耦合器又称光电耦合器&#xff0c;是现代电子学中必不可少的元件&#xff0c;确保隔离电路之间安全有效的信号传输。本文探讨了光耦合器的特性及其多样化应用&#xff0c;强调了它们在各种电子系统中的关键作用。 什么是光耦合器&#xff1f; 光耦合器是一种设计用于利用光传…

Java 18新特性详细介绍

Java作为一门广泛使用的编程语言&#xff0c;一直在不断地发展和更新。Java 18是Java的最新版本&#xff0c;它引入了许多新特性和改进&#xff0c;使得开发过程更加高效、安全和便捷。本文将详细介绍Java 18的新特性&#xff0c;帮助开发者更好地了解和应用这些新功能。 JEP …

vue详解(4)

1. v-model 原理 原理&#xff1a;v-model本质上是一个语法糖。例如应用在输入框上&#xff0c;就是 value属性 和 input事件 的合写。作用&#xff1a;提供数据的双向绑定。① 数据变&#xff0c;视图跟着变 :value&#xff1b;② 视图变&#xff0c;数据跟着变 input注意&am…

【MySQL数据库】CRUD 增 删 改 查 超详解,有这一篇就够了!

​ ​ &#x1f525;个人主页&#xff1a; 中草药 &#x1f525;专栏&#xff1a;【MySQL】探秘&#xff1a;数据库世界的瑞士军刀 目录 ⚗️一.CRUD &#x1f9ea;二.新增&#xff08;Create&#xff09; &#x1f9eb;1.基本操作 &#x1f9ec;2.使用SELECT插入 &#x…

长难句5.24

There is pressure for change from within the profession, but opponents of change among the regulators insist that keeping outsiders out of a law firm isolates lawyers from the pressure to make money rather than serve clients ethically. 在(律师)行业内部也有…

云计算历史、业务驱动因素和术语 (Cloud Computing History, Business Drivers and Terminologies)

云计算的历史与定义 (History and Definition of Cloud Computing) 历史 (History) 云计算的概念化始于很久以前&#xff0c;早在1963年。麻省理工学院从美国国防高级研究计划局获得研究资金&#xff0c;用于开发一种“计算机可同时被两人或更多人使用”的技术。在早期的云计算…

区块链钱包如果丢失了私钥或助记词,资产还能恢复吗?

如果你丢失了区块链钱包的私钥或助记词&#xff08;通常是用于恢复钱包的短语或种子&#xff09;&#xff0c;那么你的资产在大多数情况下是无法恢复的。私钥是访问和控制你在区块链上资产的唯一凭证&#xff0c;而助记词&#xff08;如BIP39标准中的12、18、24个单词的短语&am…

centos常见命令总结

一、【写在前面】 注意到csdn在鼓励作者创作centos常见命令相关的文章&#xff0c;借此机会水一篇博文。 centos作为上个版本国内最常用的开源操作系统&#xff0c;占有量非常恐怖&#xff0c;排个前三应该没有任何疑问。但是我建议直接去学ubuntu&#xff0c;因为主流在用的…

【系统架构师】-案例篇(十五)SOA、微服务与数据库

1、可复用构件应具备哪些属性 可用性&#xff1a;构件必须易于理解和使用。 质量&#xff1a;构件及其变形必须能正确工作。 适应性&#xff1a;构件应该易于通过参数化等方式在不同语境中进行配置。 可移植性&#xff1a;构件应能在不同的硬件运行平台和软件环境中工作。 可变…

Spring Boot实现RabbitMQ监听消息的几种方式

Spring Boot实现RabbitMQ监听消息的几种方式 在现代的分布式系统中&#xff0c;消息队列扮演着至关重要的角色&#xff0c;用于解耦服务之间的通信&#xff0c;实现异步消息传递。而RabbitMQ作为其中一种常用的消息队列服务&#xff0c;在Spring Boot中得到了广泛的应用。本文…

pip(包管理器) for Python

pip是什么 pip是Python的包安装程序&#xff0c;即python包管理器。您可以使用 pip 从Python包索引和其他索引安装包。 1. pip 安装 python 包 pip install 包名 例如&#xff1a;pip install pymssql &#xff1a; 使用pip安装数据库驱动包 pymssql 2.pip 卸载 python 包 pi…

【Axure教程】拖动换位选择器

拖动换位选择器通常用于从一个列表中选择项目并将其移动到另一个列表中。用户可以通过拖动选项来实现选择和移动。这种交互方式在许多Web应用程序中很常见&#xff0c;特别是在需要对项目分组的情况下。 所以今天作者就教大家怎么在Axure用中继器制作一个拖动换位选择器的原型…

告别硬编码:Spring条件注解优雅应对多类场景

一、背景 在当今的软件开发中&#xff0c;服务接口通常需要对应多个实现类&#xff0c;以满足不同的需求和场景。举例来说&#xff0c;假设我们是一家2B公司&#xff0c;公司的产品具备对象存储服务的能力。然而&#xff0c;在不同的合作机构部署时&#xff0c;发现每家公司底…

RedisTemplateAPI:List

文章目录 ⛄介绍⛄List的常见命令有⛄RedisTemplate API❄️❄️添加缓存❄️❄️将List放入缓存❄️❄️设置过期时间(单独设置)❄️❄️获取List缓存全部内容&#xff08;起始索引&#xff0c;结束索引&#xff09;❄️❄️从左或从右弹出一个元素❄️❄️根据索引查询元素❄…

探索 Rust 语言的精髓:深入 Rust 标准库

探索 Rust 语言的精髓&#xff1a;深入 Rust 标准库 Rust&#xff0c;这门现代编程语言以其内存安全、并发性和性能优势而闻名。它不仅在系统编程领域展现出强大的能力&#xff0c;也越来越多地被应用于WebAssembly、嵌入式系统、分布式服务等众多领域。Rust 的成功&#xff0…

Day25:Leetcode:669. 修剪二叉搜索树 + 108.将有序数组转换为二叉搜索树 + 538.把二叉搜索树转换为累加树

LeetCode&#xff1a;669. 修剪二叉搜索树 问题描述 解决方案&#xff1a; 1.思路 2.代码实现 class Solution {public TreeNode trimBST(TreeNode root, int low, int high) {if (root null) {return null;}if (root.val < low) {return trimBST(root.right, low, hi…

Nginx文件解析漏洞复现:CVE-2013-4547

漏洞原理 CVE-2013-4547漏洞是由于非法字符空格和截止符导致Nginx在解析URL时的有限状态机混乱&#xff0c;导致攻击者可以通过一个非编码空格绕过后缀名限制。假设服务器中存在文件1. jpg&#xff0c;则可以通过改包访问让服务器认为访问的为PHP文件。 漏洞复现 开启靶场 …

Energia单片机实验-饮水机模拟

一、要求分析 利用状态机程序思想&#xff0c;使用MSP-EXP430F5529 Launchpad板卡实现以下模拟饮水机的功能。 饮水机是我们生活中常见的家用设备。假设一个简易的饮水机有两个按键&#xff1a;童锁按键[PUSH1]和热水按键[PUSH2]。 按键功能说明&#xff1a; 1.童锁按键&#x…