[API]ListList方法集合排序Lambda表达式(四)
List接口:
-
继承自Collection接口,List集合是可重复集合,并且有序,还提供了一套可以通过下标来操作元素的方法
-
常见的实现类:
-
ArrayList:内部使用数组实现,查询性能更好(直接下标找到物理地址)、增删性能不好
-
LinkedList:内部使用链表实现,查询性能不好,首尾增删性能好
注意:在对集合操作的增删性能没有特别苛刻的要求时,通常选择ArrayList
-
List集常用方法:
-
get():根据下标获取元素
-
set():将指定元素设置到指定位置,并返回被替换的元素(用时才接收)
-
重载remove():删除指定位置元素,并返回被删除的元素(用时才接收)
-
重载add():将指定元素添加到指定位置,理解为插入操作
public class ListDemo {public static void main(String[] args) {List<String> list = new LinkedList<>();list.add("one");list.add("two");list.add("three");list.add("four");list.add("five");list.add("one");System.out.println("list:"+list); //[one, two, three, four, five, one]//E get(int index):获取指定下标所对应的元素String e = list.get(2);System.out.println(e); //threefor(int i=0;i<list.size();i++){System.out.println(list.get(i));}Iterator<String> it = list.iterator();while(it.hasNext()){System.out.println(it.next());}for(String s : list){System.out.println(s);}System.out.println("-----------------------------");/*E set(int index, E e):将给定元素设置到指定位置,返回被替换的元素*///list.set(2,"six"); //将list中下标为2的元素设置为six---常规用法String old = list.set(2,"six"); //将list中下标为2的元素设置为six,同时将原数据返回oldSystem.out.println("list:"+list); //[one, two, six, four, five, one]System.out.println(old); //three/*E remove(int index):删除指定位置元素,并返回指定位置元素*///list.remove(2); //删除下标为2的元素---常规用法String s = list.remove(2); //删除下标为2的元素,并将被删除元素返回给sSystem.out.println("list:"+list); //[one, two, four, five, one]System.out.println(s); //six/*void add(int index,E e):将给定元素e添加到index所指定的位置,相当于插入操作*/list.add(3,"seven"); //在list下标为3的位置插入sevenSystem.out.println(list); //[one, two, four, five, one]}
}
subList():获取集合的子集(含头不含尾)
public class SubListDemo {public static void main(String[] args) {/*List提供了获取子集的操作:List subList(int start,int end):含头不含尾*/List<Integer> list = new ArrayList<>();for(int i=0;i<10;i++){list.add(i*10);}System.out.println("list:"+list); //[0, 10, 20, 30, 40, 50, 60, 70, 80, 90]List<Integer> subList = list.subList(3,8); //获取下标3到7的子集System.out.println("subList:"+subList); //[30, 40, 50, 60, 70]//将子集每个元素都扩大10倍for(int i=0;i<subList.size();i++){subList.set(i,subList.get(i)*10);}System.out.println("subList:"+subList); //[300, 400, 500, 600, 700]//注意:对子集的操作就是对原集合对应的元素操作System.out.println("list:"+list); //[0, 10, 20, 300, 400, 500, 600, 700, 80, 90]list.set(3,1000); //将原集合下标为3的元素的数据修改为1000System.out.println("list:"+list); //[0, 10, 20, 1000, 400, 500, 600, 700, 80, 90]//原集合数据改变后,子集数据跟着变了System.out.println("subList:"+subList); //[1000, 400, 500, 600, 700]list.remove(0);System.out.println("list:"+list); //[10, 20, 1000, 400, 500, 600, 700, 80, 90]//原集合长度修改之后,子集将不能再进行任何操作,操作则发生异常,但是可以重新获取子集System.out.println("subList:"+subList); //运行时发生不支持修改异常}
}
集合排序:
-
Collections为集合的工具类,里面定义了很多静态方法用于操作集合
-
Collections.sort(List list)方法:可以对list集合进行自然排序(从小到大),但是其要求List集合中的元素必须是可比较的,判断是否可以比较的标准是元素是否实现了Comparable接口,若没有实现该接口则直接发生编译错误,但是在实际开发中,我们一般是不会不让我们自己写的类去实现Comparable接口的,因为这对我们的程序有侵入性。
-
侵入性:当我们调用某个API功能时,其要求我们为其修改其它额外的代码,这个现象叫做侵入性。侵入性越强越不利于程序的后期维护,应尽量避免。
-
建议使用重载的Collections.sort(List list, Comparator o);可以通过Comparator来自定义比较规则
public class SortInteger {public static void main(String[] args) {Random rand = new Random();List<Integer> list = new ArrayList<>();for(int i=0;i<10;i++){list.add(rand.nextInt(100));}System.out.println("list原始数据:"+list); //无序Collections.sort(list); //自然排序(从小到大)System.out.println("list排序后数据:"+list); //有序(小到大)Collections.reverse(list); //反转list集合(数据已经改变了)System.out.println("list反转后数据:"+list);System.out.println("第1个元素为:"+list.get(0)); //输出第1个元素/*List<String> list = new ArrayList<>();list.add("jack");list.add("rose");list.add("tom");list.add("jerry");list.add("black");list.add("Kobe");System.out.println("list原始数据:"+list); //[jack, rose, tom, jerry, black, Kobe]//对英文字符串排序时,会按首字母的ASCII码来排//若首字母相同,则比较第2个字母的ASCII码,以此类推Collections.sort(list);System.out.println("list排序后数据:"+list); //[Kobe, black, jack, jerry, rose, tom]*/}
}public class SortPoint {public static void main(String[] args) {List<Point> list = new ArrayList<>();list.add(new Point(5,8));list.add(new Point(15,60));list.add(new Point(57,89));list.add(new Point(1,4));list.add(new Point(10,8));list.add(new Point(22,35));System.out.println("list原始数据:"+list);//jdk1.8时,List集合自身提供了sort方法进行排序,方法中需要传入比较器list.sort(new Comparator<Point>() {public int compare(Point o1, Point o2) {return o1.getX()-o2.getX();}});System.out.println("list排序后数据:"+list);list.sort((o1,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, 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; //升序return len2-len1; //降序//return o1.getX()-o2.getX(); //按x坐标升序//return o2.getY()-o1.getY(); //按y坐标降序}});*/Collections.sort(list,(o1,o2)->{int len1 = o1.getX()*o1.getX()+o1.getY()*o1.getY();int len2 = o2.getX()*o2.getX()+o2.getY()*o2.getY();return len1-len2; //升序});System.out.println("list排序后数据:"+list);}
}
Lambda表达式:
-
JDK1.8之后推出了一个新特性:Lambda表达式
-
规则:
-
不是任何匿名内部类都可以转换为Lambda表达式
-
Lambda表达式对接口的要求:只能是函数式接口
-
函数式接口:接口中要求实现类必须重写的方法只有一个
-
语法:
(参数列表)->{方法体
}
public class LambdaDemo {public static void main(String[] args) {List<String> list = new ArrayList<>();//匿名内部类写法Collections.sort(list, new Comparator<String>() {public int compare(String o1, String o2) {return o1.length()-o2.length();}});//Lambda表达式写法Collections.sort(list, (String o1, String o2) -> {return o1.length()-o2.length();});//Lambda表达式中的参数类型可以不写Collections.sort(list, (o1, o2) -> {return o1.length()-o2.length();});//Lambda表达式方法体中只有一句代码,方法体的{}可以不写,如果这句话中有return,也一并不写Collections.sort(list, (o1, o2) -> o1.length()-o2.length());//Lambda表达式的方法参数只有1个,那么()可以忽略不写---本案例不适用}
}
Set接口:
不可重复集合,并且大部分实现类都是无序的
public class SetDemo {public static void main(String[] args) {Set<String> set = new HashSet<>();set.add("one");set.add("two");set.add("three");set.add("four");set.add("five");set.add("two"); //无法被正确添加进去,因为Set集是不可重复集合,并且大部分都无序System.out.println(set);}
}
小面试题:如何去重?
public class SetDemo {public static void main(String[] args) {//小面试题:如何去重?List<String> list = new ArrayList<>();list.add("one");list.add("two");list.add("three");list.add("four");list.add("five");list.add("two");System.out.println("list:"+list); //[one, two, three, four, five, two]Set<String> set = new HashSet<>();set.addAll(list); //将list集合元素都添加到set集合中System.out.println("set:"+set); //[four, one, two, three, five]}
}
什么是二进制:逢2进1的计数规则。计算机中的变量/常量都是按照2进制来计算的
-
2进制:
-
规则:逢2进1
-
数字:0 1
-
基数:2
-
权:128 64 32 16 8 4 2 1
-
-
如何将2进制转换为10进制:
-
正数:将二进制每个1位置的权相加
-
权: 32 16 8 4 2 1
二进制: 1 0 1 1 0 1
十进制: 32+8+4+1=45权: 32 16 8 4 2 1
二进制: 1 0 0 1 1 0
十进制: 32+4+2=38
注:
十进制:
-
规则:逢10进1
-
数字:0 1 2 3 4 5 6 7 8 9
-
基数:10
-
权:十万 万 千 百 十 个
10的0次幂------------------1
10的1次幂------------------10
10的2次幂------------------100
10的3次幂------------------1000
10的4次幂------------------10000
二进制:
-
规则:逢2进1
-
数字:0 1
-
基数:2
-
权:512 256 128 64 32 16 8 4 2 1
2的0次幂------------------1
2的1次幂------------------2
2的2次幂------------------4
2的3次幂------------------8
2的4次幂------------------16
2的5次幂------------------32
十六进制:逢16进1
-
规则:逢16进1
-
数字:0 1 2 3 4 5 6 7 8 9 a b c d e f
-
基数:16
-
权:65536 4096 256 16 1
16的0次幂------------------1
16的1次幂------------------16
16的2次幂------------------256
16的3次幂------------------4096
16的4次幂------------------65536
权的由来:基数的几次幂
相关文章:
[API]ListList方法集合排序Lambda表达式(四)
List接口: 继承自Collection接口,List集合是可重复集合,并且有序,还提供了一套可以通过下标来操作元素的方法 常见的实现类: ArrayList:内部使用数组实现,查询性能更好(直接下标找到物理地址)、…...
【ChatGPT】无需魔法打开即用的 AI 工具集锦
作者:明明如月学长, CSDN 博客专家,蚂蚁集团高级 Java 工程师,《性能优化方法论》作者、《解锁大厂思维:剖析《阿里巴巴Java开发手册》》、《再学经典:《EffectiveJava》独家解析》专栏作者。 热门文章推荐…...
Choco-slover的使用
一. 相关资料 choco-slover github源代码以及工具下载网址:https://github.com/chocoteam/choco-solverchoco-slover 官网文档:https://choco-solver.org/choco-slover安装eclipse视频:https://www.youtube.com/watch?v=qz6ATkEI_F8视频所采用的资源网址:https://drive.go…...
亚马逊、ebay、temu如何提升产品点击率?测评自养号解析
产品点击率对于店铺销售额的影响至关重要,尤其是在竞争越来越激烈的市场环境中,想要有销量和转化,提高产品listing点击率成为了非常关键的一环。 1. 产品主图 顾客浏览产品时,第一眼看到的就是主图,一张优质的主图更容…...
人工智能的前沿信息获取之使用谷歌学术搜索
谷歌学术是谷歌公司开发的一款专门针对学术搜索的在线搜索引擎[4],谷歌学术的网址为https://scholar.google.com,界面如图 6‑1所示。使用谷歌学术搜索可以检索会议或者期刊论文。只需要在检索框中输入关键字,然后点搜索按钮即可,…...
PHP快速入门06-类型转换
文章目录 前言一、关于类型转换1.1 自动类型转换1.2 显式类型转换 二、15个常用类型转化示例2.1 将字符串转换为整型2.2 将整型转换为字符串2.3 将浮点型转换为整型2.4 将整型转换为浮点型2.5 将布尔型转换为整型2.6 将整型转换为布尔型2.7 将字符串转换为浮点型2.8 将浮点型转…...
Motion Planning学习笔记一:配置空间、图、图搜索、图遍历
学习高飞博士的路径规划课程所总结的学习笔记。 目录 1、配置空间(Configuration Space, C-space) 2、图(Graphs) 3、图搜索(Graph Search Basis) 3.1、总体框架 3.2、两种基本的图遍历算法 3.3、启…...
C语言中如何判断大小端字节序?
大小端(Endian)是指多字节整数在内存中存储的方式。在计算机中,一个多字节整数由多个字节组成,而不同的机器和处理器在存储多字节整数时会有两种不同存储方式,分别为大端字节序和小端字节序。 以一个4字节整数0x12345…...
用spring-boot-starter实现事务的统一配置
一、前言 微服务架构下,多个微服务都需要事务操作,如果在每个微服务下都从头配置事务,将非常繁锁。事务配置具有高度的一致性,可以抽取出来,制作starter,在需要配置事务的服务中引入starter依赖即可。 采用…...
C语言中fopen的详细用法
fopen是C语言中用于打开文件的函数,其原型为: FILE *fopen(const char *filename, const char *mode); 其中,filename是要打开的文件名,mode是打开文件的模式。fopen函数返回一个指向FILE类型的指针,该指针指向打开的…...
C语言——学生信息管理系统(数组)
文章目录 一、前言二、目的三、框架1.菜单1.1主菜单1.2子菜单 2.流程图2.1总流程图2.2开始流程图2.3增加学生信息流程图2.4.删除学生信息流程图2.5修改学生信息流程图2.6查询学生信息流程图2.7对学生信息排序流程图 3.思路 四、代码五、演示视频 一、前言 因为最近是在赶进度总…...
【C语言】基础语法1:变量和数据类型
下一篇:运算符和表达式 ❤️🔥前情提要❤️🔥 欢迎来到C语言基本语法教程 在本专栏结束后会将所有内容整理成思维导图(结束换链接)并免费提供给大家学习,希望大家纠错指正。本专栏将以基础出发…...
linux安装和使用jekins
Jenkins详细安装配置部署--超详细_jenkins安装部署_宝贝富贵猪的博客-CSDN博客 1.安装JDK 2.获取安装包 下载页面:https://jenkins.io/zh/download/ 或者Index of /jenkins/redhat/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 3.安装Jenkins sud…...
驼峰式匹配
问题: 如果我们可以将小写字母插入模式串 pattern 得到待查询项 query,那么待查询项与给定模式串匹配。(我们可以在任何位置插入每个字符,也可以插入 0 个字符。) 给定待查询列表 queries,和模式串 patte…...
第三十七章 立方体贴图总结
立方体贴图:将多个纹理组合起来映射到一张纹理上的一种纹理类型。 一个立方体贴图时包含了6个2D纹理的纹理,每个2D纹理都组成了立方体的一个面,相当于是一个有纹理的立方体。 创建立方体贴图: 首先需要生成一个纹理,将其绑定到纹理目标上,再做其他纹理操作。补充:绑定到…...
哈希(C++)
哈希 unordered系列关联式容器unordered_map介绍 底层结构哈希概念哈希冲突哈希函数哈希冲突解决方式闭散列开散列 模拟实现哈希表的改造 哈希应用位图概念实现 布隆过滤器提出概念 unordered系列关联式容器 在C98中,STL提供了底层为红黑树结构的一系列关联式容器&…...
Spring MVC 的调用(12)
目录 SpringMVC流程 源码分析 第一步:用户发起请求到前端控制器(DispatcherServlet) 第二步:前端控制器请求处理器映射器(HandlerMappering)去查找处理器(Handle):通过xml配置或者…...
死磕内存篇 --- JAVA进程和linux内存间的大小关系
运行个JAVA 用sleep去hold住 package org.hjb.test; public class TestOnly { public static void main(String[] args) { System.out.println("sleep .."); try { Thread.sleep(10000000); } catch (InterruptedException e) { e.printStackTrace(); } } } java -…...
信号完整性分析:关于传输线的三十个问题解答(三)
21.FR4 中 50 欧姆传输线的单位长度电感是多少?如果阻抗加倍怎么办?(What is the inductance per length of a 50-Ohm transmission line in FR4? What if the impedance doubles?) FR4 中的所有 50 欧姆传输线的单位长度电感约…...
Java基础:Stream流常用方法
获取Stream流的方式 java.util.stream.Stream 是Java 8新加入的流接口。(并不是一个函数式接口) 获取一个流非常简单,有以下几种常用的方式: 所有 Collection 集合都可通过 stream 默认方法获取流(顺序流)…...
XCTF-web-easyupload
试了试php,php7,pht,phtml等,都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接,得到flag...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...
【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...
