Java基础之数组(附带Comparator)

文章目录

    • 基础概念
    • 可变参数组
    • 数组与List
    • Comparator类
      • 1,基本概念
      • 2,使用Comparator的静态方法(Java 8+)
      • 3,常用Comparator方法
      • 4,例子
    • 排序与查找
    • 数组复制
    • 其他

基础概念

int[] anArray = new int[10];

只有创建对象时才会使用new关键字,所以数组是个对象。

数组中的每个元素都会被初始化为默认值,int 类型的就为 0,Object 类型的就为 null。 不同数据类型的默认值不同

可变参数组

1. 基本概念

  • 定义:允许函数接受不确定数量的同类型参数,这些参数会被自动封装为一个数组。
  • 作用:简化方法调用,避免为不同参数数量重载多个方法。

2. 语法示例

public void printNumbers(int... numbers) {for (int num : numbers) {System.out.println(num);}
}// 调用方式
printNumbers(1, 2, 3);      // 输出: 1 2 3
printNumbers(10, 20);       // 输出: 10 20
printNumbers();            // 可以不传参数

数组与List

将数组转为List,使用Arrays类

//1
List<Integer> aList = Arrays.asList(1, 2, 3, 4, 5);
//2
int[] anArray = new int[] {1, 2, 3, 4, 5};
List<Integer> aList = Arrays.stream(anArray).boxed().collect(Collectors.toList());
  • .boxed()转换为对应的包装类对象。
  • **.collect(Collectors.toList())**此操作会把流中的元素收集到一个List集合中。

还有一个需要注意的是,Arrays.asList 方法返回的 ArrayList 并不是 java.util.ArrayList,它其实是 Arrays 类的一个内部类:

private static class ArrayList<E> extends AbstractList<E>implements RandomAccess, java.io.Serializable{}

如果需要添加元素或者删除元素的话,需要把它转成 java.util.ArrayList

new ArrayList<>(Arrays.asList(anArray));

Comparator类

1,基本概念

int compare(T o1, T o2)
返回值含义
负整数o1 应该排在 o2 前面 (o1 < o2)
o1 和 o2 相等 (o1 == o2)
正整数o1 应该排在 o2 后面 (o1 > o2)

因此

  • o1 - o2 → 升序排序
  • o2 - o1 → 降序排序
Comparator<String> lengthComparator = new Comparator<String>() {@Overridepublic int compare(String s1, String s2) {return s1.length() - s2.length();}
};
//使用Lamda
Comparator<String> lengthComparator = (s1, s2) -> s1.length() - s2.length();

2,使用Comparator的静态方法(Java 8+)

// 按字符串长度排序
Comparator<String> lengthComparator = Comparator.comparingInt(String::length);// 按字符串长度降序排序
Comparator<String> descLengthComparator = Comparator.comparingInt(String::length).reversed();

3,常用Comparator方法

1. comparing() 和 comparingInt()/comparingLong()/comparingDouble()

// 按Person的age属性排序
Comparator<Person> byAge = Comparator.comparing(Person::getAge);// 按字符串长度排序
Comparator<String> byLength = Comparator.comparingInt(String::length);
特性comparing()comparingInt()/comparingLong()/comparingDouble()
适用类型任何Comparable类型仅限基本数据类型(int/long/double)
性能可能有装箱开销无装箱开销,性能更好
方法参数FunctionToIntFunction/ToLongFunction/ToDoubleFunction
null处理需要额外处理需要额外处理
链式调用支持thenComparing()支持thenComparingInt()等对应方法

2. thenComparing() - 多级排序

// 先按age排序,age相同再按name排序
Comparator<Person> byAgeThenName = Comparator.comparingInt(Person::getAge).thenComparing(Person::getName);

3. naturalOrder() 和 reverseOrder()

// 自然顺序排序
Comparator<String> natural = Comparator.naturalOrder();// 逆序排序
Comparator<String> reverse = Comparator.reverseOrder();

4. nullsFirst() 和 nullsLast() - 处理null值

// null值排在前面
Comparator<String> nullsFirst = Comparator.nullsFirst(Comparator.naturalOrder());// null值排在后面
Comparator<String> nullsLast = Comparator.nullsLast(Comparator.naturalOrder());

4,例子

----------------基本排序--------------
List<String> words = Arrays.asList("apple", "banana", "pear", "orange");// 按长度排序
words.sort(Comparator.comparingInt(String::length));
System.out.println(words); // [pear, apple, banana, orange]// 按长度降序
words.sort(Comparator.comparingInt(String::length).reversed());
System.out.println(words); // [banana, orange, apple, pear]
--------------对象排序-----------------
class Person {String name;int age;// 构造方法、getter、setter省略
}List<Person> people = Arrays.asList(new Person("Alice", 25),new Person("Bob", 30),new Person("Charlie", 20)
);// 按年龄排序
people.sort(Comparator.comparingInt(Person::getAge));
System.out.println(people); // [Charlie(20), Alice(25), Bob(30)]// 按年龄降序,然后按姓名升序
people.sort(Comparator.comparingInt(Person::getAge).reversed().thenComparing(Person::getName));
System.out.println(people); // [Bob(30), Alice(25), Charlie(20)]
-----------处理null值-------------
List<String> wordsWithNull = Arrays.asList("apple", null, "banana", null, "pear");// null值排在前面
wordsWithNull.sort(Comparator.nullsFirst(Comparator.naturalOrder()));
System.out.println(wordsWithNull); // [null, null, apple, banana, pear]// null值排在后面
wordsWithNull.sort(Comparator.nullsLast(Comparator.reverseOrder()));
System.out.println(wordsWithNull); // [pear, banana, apple, null, null]

排序与查找

  • Arrays.sort()方法。

  • 自定义排序(使用Comparator)

//本数据类型按照升序排列
int[] anArray = new int[] {5, 2, 1, 4, 8};
Arrays.sort(anArray);//自定义排序
//只对 1-3 位置上的元素进行反序,[A, Z, E, B, C]
String[] yetAnotherArray = new String[] {"A", "E", "Z", "B", "C"};
Arrays.sort(yetAnotherArray, 1, 3,Comparator.comparing(String::toString).reversed());
  • 二分查找,Arrays.binarySearch()
//保证数组已排序
int[] anArray = new int[] {1, 2, 3, 4, 5};
int index = Arrays.binarySearch(anArray, 4);

数组复制

// 复制整个数组(长度相同)
static int[] copyOf(int[] original, int newLength)// 复制数组的指定范围
static int[] copyOfRange(int[] original, int from, int to)
------------例子-------------
int[] original = {1, 2, 3, 4, 5};
int[] copy = Arrays.copyOf(original, 3);  // [1, 2, 3]
int[] rangeCopy = Arrays.copyOfRange(original, 1, 4);  // [2, 3, 4]

其他

数组去重

int[] numbers = {1, 2, 2, 3, 4, 4, 4, 5};
Arrays.sort(numbers);int[] unique = Arrays.stream(numbers).distinct().toArray();
// 结果: [1, 2, 3, 4, 5]

数组填充

// 用指定值填充整个数组
static void fill(int[] a, int val)// 填充数组的指定范围 [fromIndex, toIndex)
static void fill(int[] a, int fromIndex, int toIndex, int val)
--------------例子-----------
int[] numbers = new int[5];
Arrays.fill(numbers, 1);  // [1, 1, 1, 1, 1]// 部分填充
Arrays.fill(numbers, 1, 3, 9);  // [1, 9, 9, 1, 1]

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

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

相关文章

Apache Doris 在数据仓库中的作用与应用实践

在当今数字化时代&#xff0c;企业数据呈爆炸式增长&#xff0c;数据仓库作为企业数据管理和分析的核心基础设施&#xff0c;其重要性不言而喻。而 Apache Doris&#xff0c;作为一款基于 MPP&#xff08;Massively Parallel Processing&#xff0c;大规模并行处理&#xff09;…

P1438 无聊的数列/P1253 扶苏的问题

因为这两天在写线性代数的作业&#xff0c;没怎么写题…… P1438 无聊的数列 题目背景 无聊的 YYB 总喜欢搞出一些正常人无法搞出的东西。有一天&#xff0c;无聊的 YYB 想出了一道无聊的题&#xff1a;无聊的数列。。。 题目描述 维护一个数列 ai​&#xff0c;支持两种操…

SpringBoot 自定义注解实现限流

SpringBoot 自定义注解实现限流 限流是为了防止服务器资源的过度消耗&#xff0c;通过一定的策略来控制访问频率&#xff0c;确保服务的高可用性和稳定性。其核心意义在于防止流量高峰时期接口过载&#xff0c;从而引起服务崩溃或响应延迟增加。本文将简述如何通过AOP和自定义…

Unity——QFramework框架 内置工具

QFramework 除了提供了一套架构之外&#xff0c;QFramework 还提供了可以脱离架构使用的工具 TypeEventSystem、EasyEvent、BindableProperty、IOCContainer。 这些工具并不是有意提供&#xff0c;而是 QFramework 的架构在设计之初是通过这几个工具组合使用而成的。 内置工具…

Vue3.5 企业级管理系统实战(二十二):动态菜单

在前几篇内容中已完成菜单、角色及菜单权限等相关开发&#xff0c;若要在左侧菜单根据用户角色动态展示菜单&#xff0c;需对 Sidebar 中的相关数据进行修改。鉴于其他相关方法及类型已在前文实现&#xff0c;本文不再重复阐述。 1 修改 Sidebar 组件 在 src/layout/componen…

014校园管理系统技术解析:构建智慧校园管理平台

校园管理系统技术解析&#xff1a;构建智慧校园管理平台 在教育信息化快速发展的当下&#xff0c;校园管理系统成为提升学校管理效率、优化校园服务的重要工具。该系统集成院校管理、投票管理等多个核心模块&#xff0c;面向管理员、用户和院内管理员三种角色&#xff0c;通过…

创新农业社会化服务 中和农信服务小农户的探索实践

在实现乡村振兴的道路上&#xff0c;如何让现代农业发展成果惠及广大小农户&#xff0c;是一个重要课题。作为国内领先的综合助农机构&#xff0c;中和农信多年来深耕农村市场&#xff0c;在服务小农户方面进行了诸多创新探索&#xff0c;走出了一条具有示范意义的农业社会化服…

6.3 day 35

知识点回顾&#xff1a; 三种不同的模型可视化方法&#xff1a;推荐torchinfo打印summary权重分布可视化进度条功能&#xff1a;手动和自动写法&#xff0c;让打印结果更加美观推理的写法&#xff1a;评估模式 可视化 理解深度学习网络最重要的2点&#xff1a; 1.了解损失如何定…

【如何在IntelliJ IDEA中新建Spring Boot项目(基于JDK 21 + Maven)】

AA. 我的开发环境配置与核心工具链解析 一、开发环境全览 C:\Users\Again>java -version java version "21.0.1" 2023-10-17 LTS Java(TM) SE Runtime Environment (build 21.0.112-LTS-29) Java HotSpot(TM) 64-Bit Server VM (build 21.0.112-LTS-29, mixed m…

【C++高级主题】多重继承下的类作用域

目录 一、类作用域与名字查找规则&#xff1a;理解二义性的根源 1.1 类作用域的基本概念 1.2 单继承的名字查找流程 1.3 多重继承的名字查找特殊性 1.4 关键规则&#xff1a;“最近” 作用域优先&#xff0c;但多重继承无 “最近” 二、多重继承二义性的典型类型与代码示…

登录vmware vcenter报vSphere Client service has stopped working错误

一、问题 登录vmware vcenter时发现报vSphere Client service has stopped working错误&#xff0c;导致vcenter控制台进不去 二、解决办法 打开vmware vcenter管理https://vcenterIP:5480&#xff0c;选择VMware vSphere Client&#xff0c;重启该服务后恢复正常。

MySQL关系型数据库学习

学习参考链接&#xff1a;https://www.runoob.com/mysql/mysql-tutorial.html Windows 安装MYSQL服务端的步骤&#xff1a;https://www.runoob.com/w3cnote/windows10-mysql-installer.html 1. 概念学习 MySQL 是一种关联数据库管理系统&#xff0c;关联数据库将数据保存在不…

web攻防之SSTI 注入漏洞

知识简介 &#xff1a; 模版引擎和框架的区别 ssti的中文翻译 &#xff1a; 服务端的模版的注入 模版引擎 &#xff1a;前端的用于装饰优化html的模版 最简单的就是在腾讯会议中的聊天功能 框架 &#xff1a; 这个是一套独立存在的逻辑 如TP他是一个区别于php语法的后端逻辑…

【清晰教程】利用Git工具将本地项目push上传至GitHub仓库中

Git 是一个分布式版本控制系统&#xff0c;由 Linus Torvalds 创建&#xff0c;用于有效、高速地处理从小到大的项目版本管理。GitHub 是一个基于 Git 的代码托管平台&#xff0c;提供了额外的协作和社交功能&#xff0c;使项目管理更加高效。它们为项目代码管理、团队协作和持…

极简以太彩光网络解决方案4.0正式发布,“彩光”重构园区网络极简之道

5月28日下午,锐捷网络在京举办以“光,本该如此‘简单’”为主题的发布会,正式发布极简以太彩光网络解决方案4.0。作为“彩光”方案的全新进化版本,极简以太彩光4.0从用户需求出发,聚焦场景洞察,开启了一场从底层基因出发的极简革命,通过架构、部署、运维等多维度的创新升级,以强…

Selenium 中 JavaScript 点击的优势及使用场景

*在 Selenium 自动化测试中&#xff0c;使用 JavaScript 执行点击操作&#xff08;如driver.execute_script("arguments[0].click();", element)&#xff09;相比直接调用element.click()有以下几个主要优势&#xff1a; 1. 绕过元素不可点击的限制 问题场景&#x…

CppCon 2014 学习:Cross platform GUID association with types

类型的 GUID&#xff08;全局唯一标识符&#xff09; 是在 COM 编程&#xff08;Component Object Model&#xff09; 和某些大型 C 架构&#xff08;如 Office、DirectX、跨 DLL 接口&#xff09;中关联类型信息和实现运行时类型识别与动态接口查询的重要机制。 下面我们分层解…

Android 11以上App主动连接WIFI的完整方案

早期Android版本App内连接指定的WIFI还是比较简单的&#xff0c;但是随着Android版本的提升&#xff0c;限制也越来越多。以下是一套完整的Android 11以上的WIFI应用内主动连接方案。 第一步&#xff1a;添加到建议连接&#xff1a; val wifiManager getSystemService(WIFI_…

让AI弹琴作曲不再是梦:Python+深度学习玩转自动化音乐创作

让AI弹琴作曲不再是梦:Python+深度学习玩转自动化音乐创作 一、AI也能谱出动人的旋律?真不是科幻! 还记得小时候学钢琴时老师的那句经典:“感觉不到情绪的乐句,是没灵魂的。” 当时我一边练琴一边想:要是有个机器能帮我写谱、调性又不跑调就好了! 结果几年后,真被我碰…

机器学习:集成学习概念、分类、随机森林

本文目录&#xff1a; 一、集成学习概念**核心思想&#xff1a;** 二、集成学习分类&#xff08;一&#xff09;Bagging集成&#xff08;二&#xff09;Boosting集成(三&#xff09;两种集成方法对比 三、随机森林 一、集成学习概念 集成学习是一种通过结合多个基学习器&#…