当前位置: 首页 > news >正文

[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表达式

  • 规则:

    1. 不是任何匿名内部类都可以转换为Lambda表达式

    2. Lambda表达式对接口的要求:只能是函数式接口

    3. 函数式接口:接口中要求实现类必须重写的方法只有一个

语法:

(参数列表)->{方法体
}
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接口&#xff1a; 继承自Collection接口&#xff0c;List集合是可重复集合&#xff0c;并且有序&#xff0c;还提供了一套可以通过下标来操作元素的方法 常见的实现类&#xff1a; ArrayList&#xff1a;内部使用数组实现&#xff0c;查询性能更好(直接下标找到物理地址)、…...

【ChatGPT】无需魔法打开即用的 AI 工具集锦

作者&#xff1a;明明如月学长&#xff0c; CSDN 博客专家&#xff0c;蚂蚁集团高级 Java 工程师&#xff0c;《性能优化方法论》作者、《解锁大厂思维&#xff1a;剖析《阿里巴巴Java开发手册》》、《再学经典&#xff1a;《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如何提升产品点击率?测评自养号解析

产品点击率对于店铺销售额的影响至关重要&#xff0c;尤其是在竞争越来越激烈的市场环境中&#xff0c;想要有销量和转化&#xff0c;提高产品listing点击率成为了非常关键的一环。 1. 产品主图 顾客浏览产品时&#xff0c;第一眼看到的就是主图&#xff0c;一张优质的主图更容…...

人工智能的前沿信息获取之使用谷歌学术搜索

谷歌学术是谷歌公司开发的一款专门针对学术搜索的在线搜索引擎[4]&#xff0c;谷歌学术的网址为https://scholar.google.com&#xff0c;界面如图 6‑1所示。使用谷歌学术搜索可以检索会议或者期刊论文。只需要在检索框中输入关键字&#xff0c;然后点搜索按钮即可&#xff0c;…...

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、配置空间&#xff08;Configuration Space, C-space&#xff09; 2、图&#xff08;Graphs&#xff09; 3、图搜索&#xff08;Graph Search Basis&#xff09; 3.1、总体框架 3.2、两种基本的图遍历算法 3.3、启…...

C语言中如何判断大小端字节序?

大小端&#xff08;Endian&#xff09;是指多字节整数在内存中存储的方式。在计算机中&#xff0c;一个多字节整数由多个字节组成&#xff0c;而不同的机器和处理器在存储多字节整数时会有两种不同存储方式&#xff0c;分别为大端字节序和小端字节序。 以一个4字节整数0x12345…...

用spring-boot-starter实现事务的统一配置

一、前言 微服务架构下&#xff0c;多个微服务都需要事务操作&#xff0c;如果在每个微服务下都从头配置事务&#xff0c;将非常繁锁。事务配置具有高度的一致性&#xff0c;可以抽取出来&#xff0c;制作starter&#xff0c;在需要配置事务的服务中引入starter依赖即可。 采用…...

C语言中fopen的详细用法

fopen是C语言中用于打开文件的函数&#xff0c;其原型为&#xff1a; FILE *fopen(const char *filename, const char *mode); 其中&#xff0c;filename是要打开的文件名&#xff0c;mode是打开文件的模式。fopen函数返回一个指向FILE类型的指针&#xff0c;该指针指向打开的…...

C语言——学生信息管理系统(数组)

文章目录 一、前言二、目的三、框架1.菜单1.1主菜单1.2子菜单 2.流程图2.1总流程图2.2开始流程图2.3增加学生信息流程图2.4.删除学生信息流程图2.5修改学生信息流程图2.6查询学生信息流程图2.7对学生信息排序流程图 3.思路 四、代码五、演示视频 一、前言 因为最近是在赶进度总…...

【C语言】基础语法1:变量和数据类型

下一篇&#xff1a;运算符和表达式 ❤️‍&#x1f525;前情提要❤️‍&#x1f525;   欢迎来到C语言基本语法教程   在本专栏结束后会将所有内容整理成思维导图&#xff08;结束换链接&#xff09;并免费提供给大家学习&#xff0c;希望大家纠错指正。本专栏将以基础出发…...

linux安装和使用jekins

Jenkins详细安装配置部署--超详细_jenkins安装部署_宝贝富贵猪的博客-CSDN博客 1.安装JDK 2.获取安装包 下载页面&#xff1a;https://jenkins.io/zh/download/ 或者Index of /jenkins/redhat/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 3.安装Jenkins sud…...

驼峰式匹配

问题&#xff1a; 如果我们可以将小写字母插入模式串 pattern 得到待查询项 query&#xff0c;那么待查询项与给定模式串匹配。&#xff08;我们可以在任何位置插入每个字符&#xff0c;也可以插入 0 个字符。&#xff09; 给定待查询列表 queries&#xff0c;和模式串 patte…...

第三十七章 立方体贴图总结

立方体贴图:将多个纹理组合起来映射到一张纹理上的一种纹理类型。 一个立方体贴图时包含了6个2D纹理的纹理,每个2D纹理都组成了立方体的一个面,相当于是一个有纹理的立方体。 创建立方体贴图: 首先需要生成一个纹理,将其绑定到纹理目标上,再做其他纹理操作。补充:绑定到…...

哈希(C++)

哈希 unordered系列关联式容器unordered_map介绍 底层结构哈希概念哈希冲突哈希函数哈希冲突解决方式闭散列开散列 模拟实现哈希表的改造 哈希应用位图概念实现 布隆过滤器提出概念 unordered系列关联式容器 在C98中&#xff0c;STL提供了底层为红黑树结构的一系列关联式容器&…...

Spring MVC 的调用(12)

目录 SpringMVC流程 源码分析 第一步:用户发起请求到前端控制器&#xff08;DispatcherServlet&#xff09; 第二步&#xff1a;前端控制器请求处理器映射器&#xff08;HandlerMappering&#xff09;去查找处理器&#xff08;Handle&#xff09;&#xff1a;通过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 欧姆传输线的单位长度电感是多少&#xff1f;如果阻抗加倍怎么办&#xff1f;&#xff08;What is the inductance per length of a 50-Ohm transmission line in FR4? What if the impedance doubles?&#xff09; FR4 中的所有 50 欧姆传输线的单位长度电感约…...

Java基础:Stream流常用方法

获取Stream流的方式 java.util.stream.Stream 是Java 8新加入的流接口。&#xff08;并不是一个函数式接口&#xff09; 获取一个流非常简单&#xff0c;有以下几种常用的方式&#xff1a; 所有 Collection 集合都可通过 stream 默认方法获取流&#xff08;顺序流&#xff09;…...

如何在3分钟内为Photoshop安装AVIF插件:让你的图片体积减半的终极方案

如何在3分钟内为Photoshop安装AVIF插件&#xff1a;让你的图片体积减半的终极方案 【免费下载链接】avif-format An AV1 Image (AVIF) file format plug-in for Adobe Photoshop 项目地址: https://gitcode.com/gh_mirrors/avi/avif-format 还在为网站图片加载缓慢而烦恼…...

AI 术语通俗词典:计算图

计算图是深度学习、自动微分、神经网络训练和人工智能框架中非常重要的一个术语。它用来描述&#xff1a;把一次数学计算过程表示成由节点和边组成的图结构。换句话说&#xff0c;计算图是在回答&#xff1a;模型中的输入、参数、运算和输出之间&#xff0c;到底是如何一步步连…...

OpenAgentsControl:构建多智能体协同系统的开源框架解析

1. 项目概述&#xff1a;一个面向智能体控制的开放框架最近在折腾AI智能体&#xff08;Agent&#xff09;相关的项目&#xff0c;发现一个挺有意思的开源仓库&#xff1a;darrenhinde/OpenAgentsControl。这个项目名字直译过来就是“开放智能体控制”&#xff0c;听起来就很有搞…...

别再手动调色了!用Matlab bar3函数一键生成论文级渐变三维柱状图(附完整代码)

别再手动调色了&#xff01;用Matlab bar3函数一键生成论文级渐变三维柱状图&#xff08;附完整代码&#xff09; 科研图表的美观程度直接影响论文的第一印象&#xff0c;而三维柱状图在展示多维度数据时尤为常见。传统手动调整每个柱体的颜色、透明度、光照效果不仅耗时&#…...

AI智能体GUI交互实战:从原理到实现,让AI玩转桌面应用

1. 项目概述&#xff1a;一个能“玩”游戏的AI智能体最近在AI智能体&#xff08;Agent&#xff09;的圈子里&#xff0c;一个名为“ChattyPlay-Agent”的开源项目引起了我的注意。乍一看名字&#xff0c;你可能会觉得它又是一个基于大语言模型&#xff08;LLM&#xff09;的聊天…...

AI Agent无障碍审查:自动化集成WCAG标准与axe-core实践

1. 项目概述&#xff1a;一个为AI助手打造的“无障碍”审查官最近在折腾AI应用开发&#xff0c;特别是那些能自动处理任务的智能体&#xff08;AI Agent&#xff09;&#xff0c;发现一个挺有意思但容易被忽略的问题&#xff1a;我们费尽心思让AI能写代码、分析数据、生成报告&…...

构建高质量代码数据池:从数据堆到模型营养基的进化之路

1. 项目概述&#xff1a;一个为代码生成模型量身定制的数据池最近在折腾大语言模型&#xff0c;特别是代码生成这块&#xff0c;发现一个挺有意思的现象&#xff1a;很多开发者手头有不错的代码数据集&#xff0c;但直接丢给模型训练&#xff0c;效果总是不尽如人意。要么是数据…...

告别串口线!用STM32CubeMX给STM32F103C8T6做个USB DFU Bootloader(Keil工程+完整代码)

STM32F103C8T6 USB DFU Bootloader实战&#xff1a;从实验室到产品的完整方案 在嵌入式产品开发中&#xff0c;固件升级是一个绕不开的话题。想象一下&#xff0c;当你的设备已经部署在现场&#xff0c;却发现需要修复一个关键bug或增加新功能时&#xff0c;传统的JTAG/SWD调试…...

基于Adafruit Audio FX的智能穿戴音频系统设计与实现

1. 项目概述&#xff1a;一件会“捧场”的智能夹克你有没有想过&#xff0c;你的衣服可以成为你专属的喜剧演员、气氛组或者随身音效库&#xff1f;想象一下&#xff0c;在朋友聚会时&#xff0c;一个恰到好处的罐头笑声从你的口袋响起&#xff1b;或者在你做出一个帅气动作时&…...

SAP F110自动付款:从零到精通的配置全景图

1. SAP F110自动付款入门指南 第一次接触SAP F110自动付款功能时&#xff0c;我也被那一堆配置项搞得晕头转向。记得当时为了搞清楚银行确定逻辑&#xff0c;整整花了两天时间反复测试。现在回想起来&#xff0c;如果有个系统性的指导手册&#xff0c;至少能节省一半时间。F110…...