Kotlin基础

前言

  • Decrement(递减) → 将一个值减 1 的操作

  • Predicate(谓词) → 返回布尔值(逻辑值)的函数

  • Reference(引用) → 允许使用自定义名称与对象交互

  • Runtime(运行时) → 应用程序正在运行的时刻


从输入读取数组

要从控制台读取特定大小的数组,我们首先需要创建一个已知大小的数组。在括号内,我们应该放置readln(),借助它我们可以从控制台读取输入。该readln()函数返回一个字符串,因此不要忘记将输入字符串转换为所创建数组的类型。

val numbers = IntArray(5) { readln().toInt() } // on each line single numbers from 1 to 5
println(numbers.joinToString()) // 1, 2, 3, 4, 5

如果要在一行中读取一个数组,请使用以下方法。您可以使用 readln() 函数读取该数组。您将得到一个字符串,您应该将其拆分。

// here we have an input string "1 2 3 4 5"val numbers = readln().split(" ").map { it.toInt() }.toTypedArray()
println(numbers.joinToString()) // 1, 2, 3, 4, 5

还有一种方法可以让你忽略输入字符串中的换行符和多余的空格。你可以借助正则表达式来实现这一点,正则表达式在文本搜索和编辑中经常使用。

val regex = "\\s+".toRegex()
val str = "1 2\t\t3  4\t5  6"
val nums = str.split(regex).map { it.toInt() }.toTypedArray()
println(nums.joinToString()) // 1, 2, 3, 4, 5, 6

数组大小

val numbers = intArrayOf(1, 2, 3, 4, 5) println(numbers.size) // 5

访问元素

您可以更改数组元素的值。使用索引在数组中设置值。

通过索引设置值:

array[index] = elem

通过索引获取值:

val elem = array[index]

数组索引是从0(第一个元素)到array.size-1(最后一个元素)的数字。

比较数组

val numbers1 = intArrayOf(1, 2, 3, 4)
val numbers2 = intArrayOf(1, 2, 3, 4)
val numbers3 = intArrayOf(1, 2, 3)println(numbers1.contentEquals(numbers2)) // true
println(numbers1.contentEquals(numbers3)) // false

请注意,运算符==!=不会比较数组的内容,它们仅比较指向同一对象的变量:

val simpleArray = intArrayOf(1, 2, 3, 4)
val similarArray = intArrayOf(1, 2, 3, 4)println(simpleArray == simpleArray)  // true, simpleArray points to the same object
println(simpleArray === similarArray) // false, similarArray points to another object

any()

使用谓词时,any()如果至少有一个集合元素与我们在 中定义的谓词匹配,则该函数将返回 true any()。也可以不使用谓词来调用该函数来检查集合是否为空。

fun main() {val numbers = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)// any number is even?println(numbers.any { x -> x % 2 == 0 }) // true// any number is greater than 100println(numbers.any { x -> x > 100 }) // falseval palindromes = listOf("racecar", "mom", "dad", "dog")// any palindrome?println(palindromes.any { x -> x.reversed() == x }) // true
}

none()

使用谓词时,none()如果集合中没有任何元素与 中指定的谓词匹配,则该函数将返回 true none()。与 类似any(),也可以不使用谓词来调用它,以检查集合是否为空。

fun main() {val numbers = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)// none of the numbers is even?println(numbers.none { x -> x % 2 == 0 }) // false// none of the numbers is greater than 100println(numbers.none { x -> x > 100 }) // trueval palindromes = listOf("racecar", "mom", "dad", "dog")// none is a palindrome?println(palindromes.none { x -> x.reversed() == x }) // falseval palindromes2 = listOf("cat", "dog")// none is a palindrome?println(palindromes2.none { x -> x.reversed() == x }) // true
}

all()

仅当集合中的所有元素都满足给定的谓词时,该all()函数才会返回 true。该函数的一个特殊之处在于,当集合为空时,它始终返回 true ; 这种特性在数学中也称为“空洞真值”。

fun main() {val numbers = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)// all numbers are even?println(numbers.all { x -> x % 2 == 0 }) // false// all numbers are less than 100println(numbers.all { x -> x < 100 }) // trueval palindromes = listOf("racecar", "mom", "dad", "dog")// all are palindromes?println(palindromes.all { x -> x.reversed() == x }) // falseval palindromes2 = listOf("racecar", "mom", "dad")// all are palindromes?println(palindromes2.all { x -> x.reversed() == x }) // trueval emptyIntList = emptyList<Int>()// all are even?println(emptyIntList.all { x -> x % 2 == 0 }) // trueval emptyStringList = emptyList<String>()// all are palindromes?println(emptyStringList.all { x -> x.reversed() == x }) // true
}

对对象进行排序

sorted()返回一个元素按升序排列的集合。sortedDescending()用于应用降序排列。所有基本的 Kotlin 集合都支持这些方法。

fun main() {val numbers = listOf(3, 5, 6, 4, 1, 8, 2, 7)println(numbers.sorted()) // [1, 2, 3, 4, 5, 6, 7, 8]println(numbers.sortedDescending()) // [8, 7, 6, 5, 4, 3, 2, 1]val words = listOf("racecar", "mom", "dad", "abracadabra", "MANDRAKE")println(words.sorted()) // [MANDRAKE, abracadabra, dad, mom, racecar]println(words.sortedDescending()) // [racecar, mom, dad, abracadabra, MANDRAKE]
}

倒序排列

我们可以使用两种函数以索引顺序的相反方向获取集合的副本:reversed()asReversed()。先来看看它们的区别。
请记住,在 ASCII 或 UTF-8 中,大写字母的编码值比小写字母小,所以在按十进制编码排序时,大写字母会排在小写字母前。

reversed() 函数

  • reversed() 会返回原集合的副本,并按索引顺序反转排列

  • 原始集合发生变化时,这个副本不会受到影响

fun main() {val numbers = mutableListOf(3, 5, 6, 4, 1, 8, 2, 7)val reversedNumbers = numbers.reversed()println(numbers) // 原始集合:[3, 5, 6, 4, 1, 8, 2, 7]println(reversedNumbers) // 反转后的副本:[7, 2, 8, 1, 4, 6, 5, 3]numbers.add(9)println(numbers) // 修改后的原始集合:[3, 5, 6, 4, 1, 8, 2, 7, 9]println(reversedNumbers) // 不变的副本:[7, 2, 8, 1, 4, 6, 5, 3]val words = listOf("racecar", "mom", "dad", "abracadabra", "MANDRAKE")val wordsReversed = words.reversed()println(words) // 原始列表:[racecar, mom, dad, abracadabra, MANDRAKE]println(wordsReversed) // 反转后的副本:[MANDRAKE, abracadabra, dad, mom, racecar]
}

asReversed() 方法

  • asReversed() 返回的是原集合的一个视图(引用),按索引反转排列。

  • 更轻量,因为不复制数据

  • 但要注意:如果原集合发生变化,这个视图也会同步变化

fun main() {val numbers = mutableListOf(3, 5, 6, 4, 1, 8, 2, 7)val numbersAsReversed = numbers.asReversed()println(numbers) // 原始集合:[3, 5, 6, 4, 1, 8, 2, 7]println(numbersAsReversed) // 反转视图:[7, 2, 8, 1, 4, 6, 5, 3]numbers.add(9)println(numbers) // 原始集合变了:[3, 5, 6, 4, 1, 8, 2, 7, 9]println(numbersAsReversed) // 同步变化的视图:[9, 7, 2, 8, 1, 4, 6, 5, 3]val words = listOf("racecar", "mom", "dad", "abracadabra", "MANDRAKE")val wordsAsReversed = words.asReversed()println(words) // 原始列表:[racecar, mom, dad, abracadabra, MANDRAKE]println(wordsAsReversed) // 反转视图:[MANDRAKE, abracadabra, dad, mom, racecar]
}

随机顺序

shuffled() 方法返回一个新的集合,其中原有的元素被随机打乱

  • 可以不带参数使用,也可以传入一个 Random 实例。

  • 如果传入一个种子(seed),每次运行程序时结果都可复现

fun main() {val numbers = mutableListOf(3, 5, 6, 4, 1, 8, 2, 7)val shuffledNumbers = numbers.shuffled()println(numbers) // 原始集合:[3, 5, 6, 4, 1, 8, 2, 7]println(shuffledNumbers) // 随机排列,如:[5, 3, 6, 7, 1, 8, 2, 4]val words = listOf("racecar", "mom", "dad", "abracadabra", "MANDRAKE")val shuffledWords = words.shuffled(Random(1))println(words) // 原始列表:[racecar, mom, dad, abracadabra, MANDRAKE]println(shuffledWords) // 同一个种子的随机结果:[MANDRAKE, abracadabra, mom, dad, racecar]
}

总结

在本节中,你学习了 Kotlin 中对集合进行不同顺序排列的几种方式:

  • 正序(原始顺序)

  • 倒序reversed() 创建副本,asReversed() 创建视图)

  • 随机顺序shuffled() 随机打乱)

这些方法提供了一种优雅且简洁的方式来重新组织集合数据。

GeeksForGeeks

一个帮助你学习编程和准备技术面试的免费网站(也有部分付费内容)

Stack Overflow

一个专注于编程技术问答的知名社区网站,程序员可以在上面:

  • 提出编程相关的问题(如:语法错误、框架使用、调试帮助等)

  • 回答其他用户的问题

  • 搜索海量的历史问题和解决方案

  • 通过投票机制识别高质量答案

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

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

相关文章

预防DNS 解析器安全威胁

DNS 是互联网的重要基础&#xff0c;例如 Web 访问、email 服务在内的众多网络服务都和 DNS 息息相关&#xff0c;DNS 的安全则直接关系到整个互联网应用能否正常使用。 DNS 解析器的作用是将用户输入的域名转换为对应的 IP 地址&#xff0c;以便计算机能够准确地定位并连接到…

Windows下VScode配置FFmpeg开发环境保姆级教程

相关准备 提前在本地开发环境中配置好mingw64或者msys2开发工具集。 安装VScode软件。 下载Windows版本的FFmpeg相关库 下载地址&#xff1a;https://ffmpeg.org/download.html 下载步骤&#xff1a;如下图。 下载后的文件&#xff1a;包含了可执行文件ffmpeg、ffpl…

Lecture #19 : Multi-Version Concurrency Control

CMU15445课程笔记多版本并发控制 多版本并发控制讲的是Mvcc。 即维护单个逻辑对象的多个物理版本&#xff0c; 这样当一个事务读取某个对象的时候不会阻塞其他事务写入该对象&#xff1b; 反之亦然。 但是Mvcc不保护写写冲突&#xff0c; 对于这种情况&#xff0c; 可能需要其两…

imx6ul Qt运行qml报错This plugin does not support createPlatformOpenGLContext!

imx6ul运行qml的Qt程序报错This plugin does not support createPlatformOpenGLContext!1、开发环境2、问题复现3、解决办法第一种方法第二种方法4、结论1、开发环境 主板&#xff1a;imx6ul Qt版本&#xff1a;5.9.6 文件系统&#xff1a;buildroot 问题描述&#xff1a;现需…

软考中项系统集成第 5 章:软件工程全流程考点拆解,备考逻辑清晰

备考系统集成项目管理工程师的小伙伴们&#xff0c;福利来啦&#xff01;今天开始为大家带来《系统集成项目管理工程师&#xff08;第 3 版&#xff09;》考点的思维导图&#xff0c;今天带来的是第5章。第 5 章聚焦软件工程&#xff0c;涵盖软件工程定义、软件需求、软件设计、…

ICLR 2025 | InterpGN:时间序列分类的透明革命,Shapelet+DNN双引擎驱动!

在Rensselaer理工学院、Stony Brook大学与IBM Research的合作下&#xff0c;本文聚焦于如何在时间序列分类任务中兼顾性能与可解释性。传统深度学习模型虽然准确率高&#xff0c;却常被诟病为“黑盒”&#xff0c;难以赢得如医疗等高风险领域的信任。为此&#xff0c;作者提出了…

使用ENO将您的JSON对象生成HTML显示

ENO 是简单易用&#xff0c;性能卓越&#xff0c;自由灵活开源的 WEB 前端组件&#xff1b;实现 JSON 与 HTML 互操作的 JavaScript 函数库。没有任何其它依赖&#xff0c;足够轻量。 WEBPack NPM 工程安装。 npm install joyzl/eno 然后在JS中引用 import "joyzl/eno…

7.12 卷积 | 最小生成树 prim

lc1900.模拟比赛算出两个指定选手最早和最晚能在第几轮碰到。还是建议dfs捏模拟比赛&#xff0c;找出两个特定选手&#xff08;firstPlayer和secondPlayer&#xff09;最早和最晚相遇的轮次。1. 定义了一个“选手”结构体&#xff0c;包含两个属性a&#xff08;战斗力&#xff…

LVS-NAT模式配置

目录 1、负载调度器配置 配置IP地址 安装ipvsadm 开启路由转发功能 加载ip_vs模块 启动ipvsadm服务 配置负载分配策略 查看验证 2、web节点配置 3、测试 1、负载调度器配置 配置IP地址 增加一块网卡 cd /etc/sysconfig/network-scripts/ cp ifcfg-ens192 ifcfg-ens…

中国银联豪掷1亿采购海光C86架构服务器

近日&#xff0c;中国银联国产服务器采购大单正式敲定&#xff0c;基于海光C86架构的服务器产品中标&#xff0c;项目金额超过1亿元。接下来&#xff0c;C86服务器将用于支撑中国银联的虚拟化、大数据、人工智能、研发测试等技术场景&#xff0c;进一步提升其业务处理能力、用户…

web网页,在线%食谱推荐系统%分析系统demo,基于vscode,uniapp,vue,java,jdk,springboot,mysql数据库

经验心得两业务单,项目前端在VSCode、HBuilder环境下整合Uniapp、Vue。后端使用Java、SpringBoot和MySQL&#xff0c;使用这些技术栈咱们就可以搭建在线食谱推荐与分析功能的系统&#xff0c;技术栈虽涉及前后端及数据库跨度不小&#xff0c;但咱们拆分模块去开发它难度就会变小…

MCP架构:AI时代的标准化上下文交互协议

本文深入解析Model Context Protocol&#xff08;MCP&#xff09;架构的创新设计&#xff0c;这是一种由Anthropic提出的标准化协议&#xff0c;旨在解决大型语言模型&#xff08;LLM&#xff09;与外部工具和数据源交互的碎片化问题。MCP采用客户端-服务器架构&#xff0c;通过…

机器学习数据集加载全攻略:从本地到网络

目录 一、加载内置数据集 1.1 Iris鸢尾花数据集 1.2 其他常用内置数据集 二、加载网络数据集 2.1 20 Newsgroups数据集 三、加载本地数据集 3.1 使用pandas加载CSV文件 3.2 处理常见问题 四、数据加载最佳实践 五、总结 在机器学习项目中&#xff0c;数据的加载是第一…

【操作系统】进程(二)内存管理、通信

JavaEE—进程(二)内存管理、通信 一、内存管理 1.映射访问 2.独立分布 防崩溃 二、通信 1.独立性保障 2.方式 2.1管道 2.1.2特点 2.1.2.1进程条件 2.1.2.2方向 2.1.2.3同步性 2.1.2.4性能 2.2消息队列 2.2.1特点 2.2.1.1方向 2.2.1.2同步性 2.2.1.3性能 2.3…

windows 装了 python2 和 python3 如何切换默认版本

现在执行 python --version 是Python 3.11.3怎么让 python 默认是 python2&#xff0c;而 python3 --version 是执行 pyhon3 呢cmd 执行 where pythonC:\Users\huyun\AppData\Local\Programs\Python\Python311-32\python.exe C:\Users\huyun\AppData\Local\Microsoft\WindowsAp…

二次封装element ui pagination组件

vue2中二次封装element ui pagination组件 html部分 <template><div class"table-pagination"><el-pagination:current-page.sync"currentPage":page-sizes"pageSizes":page-size"pageSize":layout"paginationLay…

SAP学习笔记 - 开发39 - RAP开发 BTP /DMO 官方既存测试数据的使用

上一章讲了 RAP开发流程的具体步骤&#xff0c;建表 》建Data Model View 》建 Projection View 》建Service Definition 》 建Service Binding 》Publish 服务。 SAP学习笔记 - 开发37 - RAP开发流程的具体步骤&#xff0c; 建表&#xff0c;Data Model View&#xff0c;Proj…

SQLite - C/C++ 开发与应用详解

SQLite - C/C++ 开发与应用详解 引言 SQLite 是一个轻量级的数据库引擎,它被设计成不需要服务器进程就可以独立运行。SQLite 在 C/C++ 开发领域具有广泛的应用,由于其体积小、性能高、易于集成等优点,深受开发者的喜爱。本文将详细介绍 SQLite 在 C/C++ 开发中的应用,包括…

蔚来测开一面:HashMap从1.7开始到1.8的过程,既然都解决不了并发安全问题,为什么还要进一步解决环形链表的问题?

文章目录问题的根源&#xff1a;JDK 1.7 的设计缺陷为什么必须解决这个问题&#xff1f;1\. 故障等级完全不同 &#x1f4a3;2\. JDK 1.8 的解决方案&#xff1a;一石二鸟 &#x1f985;3\. 为“不小心”的开发者提供一层保障 &#x1f6e1;️结论这是一个非常好的问题&#xf…

AI技术正以前所未有的速度重塑职业生态与行业格局,尤其在自动化测试领域,AI驱动的测试框架通过智能化、低代码化重构传统测试流程。

AI技术正以前所未有的速度重塑职业生态与行业格局&#xff0c;尤其在自动化测试领域&#xff0c;AI驱动的测试框架通过智能化、低代码化重构传统测试流程。以下从职业影响、技术架构、行业应用及应对策略四个维度展开分析&#xff0c;结合代码示例与框架设计图解&#xff1a;一…