java-集合-排序

 集合的排序

   java.util.Collections类

     Collections是集合的工具类,里面定义了很多静态方法用于操作集合.

      java.util.Collections类是Java集合框架中的一个工具类,提供了一系列静态方法来操作集合对象。它包含了各种方法,如排序、查找、更改集合中的元素等。

以下是一些常用的方法:

  1. sort(List<T> list): 对列表进行排序,使用默认的自然顺序。

  2. binarySearch(List<T> list, T key): 在指定的列表中进行二分查找,返回指定元素的索引。

  3. reverse(List<T> list): 反转指定列表中元素的顺序。

  4. shuffle(List<T> list): 随机重排指定列表中的元素。

  5. replaceAll(List<T> list, T oldVal, T newVal): 将列表中等于指定值的所有元素替换为新值。

  6. rotate(List<T> list, int distance): 将列表中的所有元素向右移动指定距离,超出列表末尾的元素将被放置在列表的开头。

  7. max(Collection<?> coll): 返回指定集合中的最大元素,根据自然顺序。

  8. min(Collection<?> coll): 返回指定集合中的最小元素,根据自然顺序。

  9. frequency(Collection<?> coll, Object o): 返回指定集合中等于指定对象的元素个数。

  10. emptyList(): 返回一个不可修改的空列表。

  11. singletonList(T o): 返回一个只包含指定对象的不可修改的列表。

      可以通过Collections类来简化对集合的操作,提高代码的简洁性和可读性。它是一个非常强大的工具类,为我们在处理集合数据时提供了很多便捷的方法。

     Collections.sort(List list)方法

     可以对List集合进行自然排序(从小到大)

代码示例:


package collection;import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;/*** 集合的排序* 集合的工具类:java.util.Collections提供了一个静态方法sort,可以对List集合* 进行自然排序*/
public class SortListDemo1 {public static void main(String[] args) {List<Integer> list = new ArrayList<>();Random random = new Random();for(int i=0;i<10;i++){list.add(random.nextInt(100));}System.out.println(list);Collections.sort(list);System.out.println(list);}
}

排序自定义类型元素

代码示例


package collection;import java.util.ArrayList;
import java.util.Collections;
import java.util.List;/*** 排序自定义类型元素*/
public class SortListDemo2 {public static void main(String[] args) {List<Point> list = new ArrayList<>();list.add(new Point(1,2));list.add(new Point(97,88));list.add(new Point(7,6));list.add(new Point(9,9));list.add(new Point(5,4));list.add(new Point(2,3));System.out.println(list);/*编译不通过的原因:Collections.sort(List list)该方法要求集合中的元素类型必须实现接口:Comparable,该接口中有一个抽象方法compareTo,这个方法用来定义元素之间比较大小的规则.所以只有实现了该接口的元素才能利用这个方法比较出大小进而实现排序操作.*/Collections.sort(list);//编译不通过 compare比较  comparable可以比较的System.out.println(list);}
}

     实际开发中,我们并不会让我们自己定义的类(如果该类作为集合元素使用)去实现Comparable接口,因为这对我们的程序有**侵入性**.

       侵入性:当我们调用某个API功能时,其要求我们为其修改其他额外的代码,这个现象就是侵入性.侵入性越强的API越不利于程序的后期可维护性.应当尽量避免.

重载的Collections.sort(List list,Comparator c)方法

代码示例


package collection;import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;/*** 排序自定义类型元素*/
public class SortListDemo2 {public static void main(String[] args) {List<Point> list = new ArrayList<>();list.add(new Point(1,2));list.add(new Point(97,88));list.add(new Point(7,6));list.add(new Point(9,9));list.add(new Point(5,4));list.add(new Point(2,3));System.out.println(list);/*Collections.sort(List list)在排序List集合时要求集合元素必须实现了Comparable接口。实现了该接口的类必须重写一个方法compareTo用与定义比较大小的规则,从而进行元素间的比较后排序。否则编译不通过。侵入性:当我们调用某个API时,其反过来要求我们为其修改其他额外的代码,这种现象就成为侵入性。侵入性不利于程序后期的维护,尽可能避免。compare:比较*/
//        Collections.sort(list);//匿名内部类的形式创建一个比较器Comparator<Point> com = new Comparator<Point>() {@Override/*** 实现比较器接口后必须重写方法compare.* 该方法用来定义参数o1与参数o2的比较大小规则* 返回值用来表示o1与o2的大小关系*/public int compare(Point o1, Point o2) {int len1 = o1.getX() * o1.getX() + o1.getY() * o1.getY();int len2 = o2.getX() * o2.getX() + o2.getY() * o2.getY();return len1-len2;}};Collections.sort(list,com);//回调模式System.out.println(list);}
}

最终没有侵入性的写法

代码示例


package collection;import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;/*** 排序自定义类型元素*/
public class SortListDemo2 {public static void main(String[] args) {List<Point> list = new ArrayList<>();list.add(new Point(1,2));list.add(new Point(97,88));list.add(new Point(7,6));list.add(new Point(9,9));list.add(new Point(5,4));list.add(new Point(2,3));System.out.println(list);/*Collections.sort(List list)在排序List集合时要求集合元素必须实现了Comparable接口。实现了该接口的类必须重写一个方法compareTo用与定义比较大小的规则,从而进行元素间的比较后排序。否则编译不通过。侵入性:当我们调用某个API时,其反过来要求我们为其修改其他额外的代码,这种现象就称为侵入性。侵入性不利于程序后期的维护,尽可能避免。compare:比较*/
//        Collections.sort(list);//匿名内部类的形式创建一个比较器
//        Comparator<Point> com = new Comparator<Point>() {
//            @Override
//            /**
//             * 实现比较器接口后必须重写方法compare.
//             * 该方法用来定义参数o1与参数o2的比较大小规则
//             * 返回值用来表示o1与o2的大小关系
//             */
//            public int compare(Point o1, Point o2) {
//                int len1 = o1.getX() * o1.getX() + o1.getY() * o1.getY();
//                int len2 = o2.getX() * o2.getX() + o2.getY() * o2.getY();
//                return len1-len2;
//            }
//        };
//        Collections.sort(list,com);//回调模式//        Collections.sort(list,new Comparator<Point>() {
//            public int compare(Point o1, Point o2) {
//                int len1 = o1.getX() * o1.getX() + o1.getY() * o1.getY();
//                int len2 = o2.getX() * o2.getX() + o2.getY() * o2.getY();
//                return len1-len2;
//            }
//        });Collections.sort(list,(o1,o2)->o1.getX() * o1.getX() + o1.getY() * o1.getY() -o2.getX() * o2.getX() - o2.getY() * o2.getY());System.out.println(list);}
}```##### 排序字符串java中提供的类,如:String,包装类都实现了Comparable接口,但有时候这些比较规则不能满足我们的排序需求时,同样可以临时提供一种比较规则来进行排序.```java
package collection;import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;public class SortListDemo3 {public static void main(String[] args) {List<String> list = new ArrayList<>();
//        list.add("Tom");
//        list.add("jackson");
//        list.add("rose");
//        list.add("jill");
//        list.add("ada");
//        list.add("hanmeimei");
//        list.add("lilei");
//        list.add("hongtaoliu");
//        list.add("Jerry");list.add("传奇");list.add("小泽老师");list.add("苍老师");System.out.println(list);//按照字符多少排序
//        Collections.sort(list);
//        Collections.sort(list, new Comparator<String>() {
//            public int compare(String o1, String o2) {return o1.length()-o2.length();
//                return o2.length()-o1.length();//反过来减就是降序
//            }
//        });Collections.sort(list,(o1,o2)->o2.length()-o1.length());System.out.println(list);}
}

总结:

1. Comparable接口和Comparator接口:这两个接口是Java中用于定义对象比较规则的关键。实现Comparable接口的对象可以直接使用Collections.sort()方法来排序,而实现Comparator接口的比较器对象可以用于对集合进行自定义排序。

2. 对List集合进行排序:可以使用Collections.sort()方法对List集合进行排序,也可以使用自定义的Comparator来实现特定的排序规则。

3. 对数组进行排序:使用Arrays.sort()方法可以对数组进行排序,该方法使用了快速排序算法来实现高效的排序。

4. 对Map集合进行排序:通常对Map集合进行排序是指对其中的键或值进行排序,可以将键或值转换为List,然后对List进行排序。

5. 对自定义对象进行排序:如果集合中存储的是自定义对象,可以让对象实现Comparable接口来定义默认的比较规则,也可以使用Comparator来定义自定义的排序规则。

6. 排序算法:Java中的排序方法通常使用了快速排序、归并排序等高效的排序算法,这些算法能够在大多数情况下提供较好的性能。

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

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

相关文章

系统架构15 - 软件工程(3)

软件过程模型 瀑布模型特点缺点 原型化模型特点两个阶段不同类型注意 螺旋模型V 模型特点 增量模型特点 喷泉模型基于构件的开发模型(CBSD)形式化方法模型敏捷模型特点“适应性” (adaptive) 而非“预设性” (predictive)“面向人的” (People-oriented) 而非“面向过程的” (P…

如何使用 WebRTC 与 Kurento 建立视频会议 App

本文作者 WebRTC Ventures 工程师。在 RTC 2018 实时互联网大会上&#xff0c;WebRTC Ventures 的资深软件工程师&#xff0c;将围绕 WebRTC 开发带来经验分享。欢迎访问RTC 开发者社区&#xff0c;与更多WebRTC开发者交流经验。 了解 WebRTC 如何工作的一种简单方式是通过学习…

golang入门

学习方法 1、在实践中学 2、适当的囫囵吞枣&#xff0c;有可能学到后面&#xff0c;对前面的疑问焕然大悟 3、注重整体&#xff0c;刚开始不要去扣细节 安装 需要配置3个环境变量&#xff0c;如果.msi文件安装时设置好了就不需要了&#xff0c;自己可以检查下 GOROOT&…

VUE--VUEX

一、什么是Vuex Vuex就是一个vue的状态&#xff08;数据&#xff09;管理工具&#xff0c;是vue项目实现大范围数据共享的技术方案。能够方便、高效的实现组件之间的数据共享。 Vuex的好处&#xff1a; &#xff08;1&#xff09;数据的存储一步到位&#xff0c;不需要层层传递…

权威媒体报道 | 百分点科技谈“数据要素×”

近日&#xff0c;国家数据局等17部门联合印发《“数据要素”三年行动计划&#xff08;2024—2026年&#xff09;》&#xff0c;引起广泛关注&#xff0c;作为数据要素技术厂商代表&#xff0c;百分点科技CTO刘译璟接受经济日报、中国高新技术产业导报采访&#xff0c;结合产业现…

<蓝桥杯软件赛>零基础备赛20周--第17周--并查集

报名明年4月蓝桥杯软件赛的同学们&#xff0c;如果你是大一零基础&#xff0c;目前懵懂中&#xff0c;不知该怎么办&#xff0c;可以看看本博客系列&#xff1a;备赛20周合集 20周的完整安排请点击&#xff1a;20周计划 每周发1个博客&#xff0c;共20周。 在QQ群上交流答疑&am…

《微信小程序开发从入门到实战》学习九十三

7.1 视图容器组件 7.1.3 swiper与swiper-item组件 swiper组件的显示效果如下图所示&#xff1a; indicator-dots、indicator-color和indicator-active-color三个属性用于设置swiper组件下方的指示点。设置指示点的颜色时&#xff0c;可以使用HexColor&#xff0c;也可以使用r…

读懂比特币—bitcoin代码分析(五)

今天的代码分析主要是 bitcoin/src/init.cpp 文件中的三个函数&#xff1a;AppInitSanityChecks、AppInitLockDataDirectory、AppInitInterfaces&#xff0c;下面我们来说明这三个函数是用来干什么的&#xff0c;并逐行解读函数代码&#xff0c;先贴出源代码如下&#xff1a; …

API接口签名的生成方式Demo

签名计算方法&#xff1a; 请求端本地生成的签名&#xff0c;计算方式&#xff1a;md5(openid#secret#timestamp)&#xff0c;其中openid和secret为申请接口时分配的唯一ID和秘钥&#xff0c;“#”为字符串的连接符。 示例&#xff1a; 若请求参数为 keywordhello&offs…

C++ 程序使用 OpenCV 库来创建一个图像金字塔,然后将这些图像合并成一张大图

文章目录 源码文件功能解读编译文件 源码文件 #include <iostream> #include <vector> #include <string> #include <opencv2/opencv.hpp>int main() {// 这里应该有代码来生成或加载一系列图像到 imagePyramidstd::vector<cv::Mat> imagePyram…

AWS 专题学习 P10 (Databases、 Data Analytics)

文章目录 专题总览1. Databases1.1 选择合适的数据库1.2 数据库类型1.3 AWS 数据库服务概述Amazon RDSAmazon AuroraAmazon ElastiCacheAmazon DynamoDBAmazon S3DocumentDBAmazon NeptuneAmazon Keyspaces (for Apache Cassandra)Amazon QLDBAmazon Timestream 2. Data & …

8.12用最少数量的箭引爆气球(LC452-M)

452. 用最少数量的箭引爆气球 - 力扣&#xff08;LeetCode&#xff09; 算法&#xff1a; 局部最优&#xff1a;当气球出现重叠&#xff0c;一起射&#xff0c;所用弓箭最少。 全局最优&#xff1a;把所有气球射爆所用弓箭最少。 为了让气球尽可能的重叠&#xff0c;需要对…

5JS语句

表达式在JavaScript中是短语&#xff0c;那么语句&#xff08;statement&#xff09;就是JavaScript整句或命令。 表达式计算出一个值&#xff0c;但语句用来执行以使某件事发生。诸如赋值和函数调用这些有副作用的表达式&#xff0c;是可以作为单独的语句的&#xff0c;这种把…

光控自动照明灯电路原理图

原理图&#xff1a; 电路原理&#xff1a; R1和R2构成分压电路&#xff0c;当环境光线较强时&#xff0c;光敏电阻阻值较小&#xff0c;R2上的电压较小&#xff0c;无法使三极管Q1导通&#xff0c;此时三极管的集电极没有电流通过&#xff0c;发光二极管DS不亮。当光线较暗时&…

uniapp使用uQRCode插件生成二维码的简单使用

最近在找移动端绘制二维码的问题 &#xff0c;直接上代码 下载 weapp-qrcode.js(可以通过npm install weapp-qrcode --save 下载,之后把它父子到untils目录下&#xff09; npm install weapp-qrcode --save在组件页面使用 <canvas id"couponQrcode" canvas-id&qu…

非线性数据结构

非线性数据结构 set集合 ①有序不重复 set ②有序可重复 multiset ③无序不重复 unordered_set ④无序可重复 unordered_multiset 有序省内存 无序省时间 //头文件 #include <set> #include <unordered_set> //构造 set<int> set1{1,2,3};//有序不重复 mul…

Spring Boot3整合MyBatis Plus

目录 1.前置条件 2.导坐标 3.配置数据源 4.mybatis-plus基础配置 5.配置mapper扫描路径 6.MyBatis Plus代码生成器整合 1.导坐标 2.编写代码生成逻辑 7.整合Druid连接池 1.前置条件 已经初始化好一个spring boot项目且版本为3X&#xff0c;项目可正常启动 初始化教程…

昂首资本闪耀石家庄交易技术峰会,尽释行业进取之姿

“2024年石家庄交易技术峰会”在中国河北石家庄举办&#xff0c;Anzo Capital昂首资本作为2024年交易峰会的独家赞助商出席本次活动&#xff0c;Anzo Capital 魄力超前&#xff0c;尽显行业进取之姿。 “开门红”——作为2024年的首场交易技术峰会&#xff0c;“石家庄交易技术…

幻兽帕鲁专用服务器设置,与好友畅玩

创建幻兽帕鲁服务器1分钟部署教程&#xff0c;阿里云和腾讯云均推出幻兽帕鲁服务器专属优惠服务器和部署教程&#xff0c;4核16G和4核32G配置可选&#xff0c;阿腾云atengyun.com分享1分钟自建幻兽帕鲁Palworld服务器教程&#xff0c;附阿里云和腾讯云专属幻兽帕鲁优惠价格表&a…

openssl3.2/test/certs - 061 - other@good.org not permitted by CA1

文章目录 openssl3.2/test/certs - 061 - othergood.org not permitted by CA1概述笔记END openssl3.2/test/certs - 061 - othergood.org not permitted by CA1 概述 openssl3.2 - 官方demo学习 - test - certs 笔记 /*! * \file D:\my_dev\my_local_git_prj\study\openSS…