Kotlin 操作符 in 的基本使用(十)

导读大纲

      • 1.0.1 迭代集合
      • 1.0.2 使用 in 检查集合和范围

1.0.1 迭代集合

  1. 使用 for (x in y) 循环最常见的情况对一个集合进行迭代

    • 您很可能已经熟悉它的行为–对输入集合中的每个元素都执行循环
  2. 在这种情况下,您只需打印颜色集合中的每个元素

    • 在循环内部,单个颜色可以用 color 来表示
fun main() {val collection = listOf("red", "green", "blue")for (color in collection) {print("$color ")}// red green blue
}
  1. 再举一个例子,我们将打印字符的二进制表示
    • 为你提供一个简单的查找表,帮助你手动破译二进制编码文本
      1. 如 1000100 1000101 1000011 1000001 1000110
    • 您将这些二进制表示法存储在Map中,将一些字母的二进制表示填入其中
      1. 然后打印Map中的内容
    • <1> 可变映射保留 Kotlin 中的元素迭代顺序
    • <2> 创建范围的"…"语法不仅适用于数字,也适用于字符
      1. 在这里,我们用它来遍历从 A 到 F的所有字符对应的二进制
    • <3> 将 ASCII 码转换为二进制码
    • <4> 使用 char 作为键,将值存储在映射
    • <5> 遍历映射表,将key 指定为 letter,并将对应的value指定为binary值
    • 通过 for 循环,可以解包正在迭代的集合中的元素
      1. 本例中是 map 中的键值对集合
    • 解构的结果存储在两个独立的变量
      1. letter变量接收key,binary变量接收value
fun main() {val binaryReps = mutableMapOf<Char, String>()         // <1>for (char in 'A'..'F') {                              // <2>val binary = char.code.toString(radix = 2)        // <3>binaryReps[char] = binary                         // <4>}for ((letter, binary) in binaryReps) {                // <5>println("$letter = $binary")}
}
==============================================
A = 1000001
B = 1000010
C = 1000011
D = 1000100
E = 1000101
F = 1000110
  1. 上述示例使用的另一个妙招是按key获取和更新 map 值的简易语法

    • 可以使用 map[key] 读取值,使用 map[key] = value 设置值
      1. 不必调用 get 和 put 等函数,拥有Python的简洁又类型安全,怎能不学
    • 这意味着无需使用 Java 风格版本的 binaryReps.put(char,binary)
      1. 而是可以使用等价但更优雅的 binaryReps[char] = binary
  2. 可以使用相同的解构语法来遍历一个列表

    • 同时跟踪当前项的索引
      1. 避免创建一个单独的变量存储索引和手动递增索引
    • <1> 将使用 withIndex 函数打印集合元素及其各自的索引
      1. 这样就可以避免创建一个单独的index变量来跟踪元素的索引值
      2. 类似Python中的: for i, elem in enumerate([1]),是不是很惊艳
fun main() {val list = listOf("10", "11", "1001")for ((index, element) in list.withIndex()) {         // <1>println("$index: $element")}// 0: 10// 1: 11// 2: 1001
}

1.0.2 使用 in 检查集合和范围

  1. 还可以使用 in 操作符检查某个值是否在某个范围

    • 或者使用其反义词"!in"检查某个值是否不在某个范围
  2. 例如,在验证用户输入时,经常需要检查输入字符是否确实是字母或不包括数字

    • <1> 使用 in 编写一些小型辅助函数 isLetter 和 isNotDigit
      1. 检查某个字符是否属于某个字符范围
    • "c in ‘a’…‘z’"的底层工作原理仍然要
      1. 检查字符的序列码是否介于第一个字母的代码和最后一个字母的代码之间
        • 实际上会转换为判断 “‘a’ <= c && c <= ‘z’”
      2. 但这一逻辑被简洁地隐藏在标准库中 range 的实现
fun isLetter(c: Char) = c in 'a'..'z' || c in 'A'..'Z'     // <1>
fun isNotDigit(c: Char) = c !in '0'..'9'                   // <1>
fun main() {println(isLetter('q'))// trueprintln(isNotDigit('x'))// true
}
  1. in 和 !in 操作符也可以在 when 表达式中使用
    • when表达式真的很强大–传送门
    • 需要检查多个不同的范围时,这就更加方便
    • <1> 检查数值是否在 0 到 9 的范围
    • <2> 可以合并多个范围, 即when的分支支持多个选项,以逗号分隔
fun recognize(c: Char) = when (c) {in '0'..'9' -> "It's a digit!"                     // <1>in 'a'..'z' , in 'A'..'Z' -> "It's a letter!"      // <2>else -> "I don't know..."
}
fun main() {println(recognize('8'))// It's a digit!
}
  1. 范围也不局限于字符
    • 如果您有任何支持比较实例的类,通过实现 kotlin.Comparable 接口
      1. 就可以创建该类型对象的范围
    • <1> 底层逻辑是等同于 “Java” <= “Kotlin” && “Kotlin” <= “Scala”
      1. 请注意,这里的字符串是按字母顺序比较
        • 因为 String 类就是这样实现 kotlin.Comparable 接口
      2. 在按字母顺序排序时,"Java"排在"Kotlin"之前, 而"Kotlin"排在"Scala"之前
        • 因此 “Kotlin” 位于两个字符串之间,检查结果为true
fun main() {println("Kotlin" in "Java".."Scala")            // <1>// true
}
  1. 同样的检查方法也适用于集合
    • <1> 该集合不包含 “Kotlin” 字符串,所以检查结果为false
fun main() {println("Kotlin" in setOf("Java", "Scala"))   // <1>// false
}

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

HTML和CSS做一个无脚本的手风琴页面(保姆级)

一、前言 使用HTML和CSS做一个无脚本的手风琴页面。让知识以自己喜欢的方式进入脑子&#xff0c;适用于很多场景&#xff0c;比如以下&#xff1a; 【注&#xff1a;图片源自百度】 二、HTML框架 使用外部样式表&#xff0c;将CSS文件用link标签引入 整体框架如下图&#x…

20240923 每日AI必读资讯

GPT-4o能玩《黑神话》&#xff01;精英怪胜率超人类&#xff0c;无强化学习纯大模型方案 - 阿里巴巴的研究人员们提出了一个新型VARP&#xff08;视觉动作角色扮演&#xff09;智能体框架。 - 能直接将游戏截图作为输入&#xff0c;通过视觉语言模型推理&#xff0c;最终生成…

WebGL颜色与纹理

WEBGL中的着色器变量包括以下种类&#xff1a; 属性变量&#xff08;Attribute Variables&#xff09;&#xff1a;这些变量用于接收从应用程序中传递的顶点数据&#xff0c;比如顶点位置和颜色&#xff0c;是只读的不可修改。统一变量&#xff08;Uniform Variables&#xff…

STM32篇:开发环境安装

编程语言&#xff1a;C语言 需要安装的软件有两个&#xff1a;Keil5 和 STM32CubeMX 一.Keil5 的安装 使用 Keil4 写 STM32 代码其实也是可以&#xff0c;但需要很复杂的配置&#xff0c;不建议新手操作。 比较推荐 Keil5 编写 STM32 &#xff0c;只需要一些简单的设置就可…

定了,东湖高新区下半年中高级职称申报时间

2024年东湖高新区中级职称申报开始了&#xff0c;水测成绩上周已出&#xff0c;本周已经开始申报了&#xff0c;时间确实挺着急的。 报送材料起止时间及地点&#xff1a; &#xff08;一&#xff09;网上报名时间&#xff1a; 2024年9月14日至9月30日24:00 &#xff08;二&…

C++ | Leetcode C++题解之第429题N叉树的层序遍历

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<vector<int>> levelOrder(Node* root) {if (!root) {return {};}vector<vector<int>> ans;queue<Node*> q;q.push(root);while (!q.empty()) {int cnt q.size();vector<…

C/C++中的内存管理

文章目录 前言一、C/C中的内存分布二、C语言中动态内存管理方式&#xff1a;malloc/calloc/realloc/free 三、C中的内存管理方式四、operator new与operator delete函数五、new和delete的实现原理 六、定位new表达式(placement-new) 七、malloc/free和new/delete的区别 总结 前…

django学习入门系列之第十点《A 案例: 员工管理系统15》

文章目录 15 认识Ajax15.4 ajax请求的返回值实例2&#xff1a;前端输入数据提交到后端实例3&#xff1a;传输多个数据 往期回顾 15 认识Ajax 15.4 ajax请求的返回值 一般数据交互整合的都是json格式 后端一般会返回一个JSON格式 返回json格式一般有以下两种写法 上面注释的…

【全网最全】2024年华为杯研究生数学建模A题成品论文

您的点赞收藏是我继续更新的最大动力! 一定要点击如下的卡片&#xff0c;那是获取资料的入口&#xff01; 点击链接获取群聊【2024华为杯研赛资料汇总】&#xff1a;https://qm.qq.com/q/yB6JDUTaWAhttps://qm.qq.com/q/yB6JDUTaWAA题第一问是关于如何建立一个低复杂度模型&a…

Java--File

FIle 概述 File的构造方法 > 1. 一个File对象代表硬盘中实际存在的一个文件或者目录。 > 2. 无论该路径下是否存在文件或者目录&#xff0c;都不影响File对象的创建。 代码演示&#xff1a; // 文件路径名 String pathname "D:\\aaa.txt"; File file1 new …

一些迷你型信息系统 - 2

1 Linux内核数据结构信息查询 Linux内核的数据结构众多&#xff0c;成千上万&#xff0c;做一个程序来存储查询信息&#xff1b;自己录入数据&#xff1b; 代码字段最长可录入65535个字符&#xff1b;每个字段录入时长度超限会有红色告警&#xff1b; 其他的以后想到再做&#…

5分钟快速制作高质量、美观的Excel甘特图

你是否还在为如何制作甘特图而感到苦恼&#xff1f; 是否因为甘特图制作过程繁琐、耗时过长而影响了你的工作效率&#xff1f; 是否每当任务计划发生变更时&#xff0c;都需要反复重新绘制甘特图&#xff0c;让你感到疲惫不堪&#xff1f; 又或者&#xff0c;你是否一直渴望…

【AI算法岗面试八股面经【超全整理】——NLP】

AI算法岗面试八股面经【超全整理】 概率论【AI算法岗面试八股面经【超全整理】——概率论】信息论【AI算法岗面试八股面经【超全整理】——信息论】机器学习【AI算法岗面试八股面经【超全整理】——机器学习】深度学习【AI算法岗面试八股面经【超全整理】——深度学习】NLP【A…

cmd快速进入文件夹目录下

首先&#xff0c;将文件夹直接点击左键拖动至cmd窗口中&#xff0c;就可以得到目录路径。 还有就是&#xff0c;在命令行直接敲入D:或者C:就可以在磁盘之间进行转换&#xff0c;注意冒号不要丢。 再有&#xff0c;如果进入某磁盘中的一个文件夹&#xff0c;使用cd命令。路径获取…

新质农业——水肥一体化技术

橙蜂智能公司致力于提供先进的人工智能和物联网解决方案&#xff0c;帮助企业优化运营并实现技术潜能。公司主要服务包括AI数字人、AI翻译、埃域知识库、大模型服务等。其核心价值观为创新、客户至上、质量、合作和可持续发展。 橙蜂智农的智慧农业产品涵盖了多方面的功能&…

开机容易关机难?合宙Air201资产定位模组LuatOS的PWRKEY控制来实现!

关于合宙Air201&#xff0c;我们已经发布了5期基础知识啦&#xff01;你是不是已经都学会了&#xff1f; 来来来&#xff0c;我们继续高阶学习&#xff1a;合宙Air201应用示例——PWRKEY控制关机功能 PWRKEY控制关机功能 合宙Air201资产定位模组——是一个集成超低功耗4G通信…

命名管道详解

命名管道 匿名管道应用的限制就是只能在具有共同祖先的进程间通信。如果我们想要在不相关的进程之间交换数据&#xff0c;可以使用使用FIFO文件来做这项工作&#xff0c;它被称为命名管道。命名管道是一种特殊类型的文件。 mkfifo函数 命名管道可以从命名行上创建&#xff0c…

iOS V2签名网站系统源码,开源免授权(含视频教程)

这是一款iOS签名站的开源源码&#xff0c;免去了授权&#xff0c;它支持UDID获取、软件选择以及签名码功能。 同时&#xff0c;用户可以多开APP进行安装。这是一个自主可下载的版本&#xff0c;感兴趣的用户可以自行获取。 源码下载&#xff1a;https://download.csdn.net/do…

云和恩墨携手华为,发布zCloud数据库备份管理一体机并宣布共建数据保护生态...

为期三天的第九届华为全联接大会&#xff08;HUAWEI CONNECT 2024&#xff09;于9月19日在上海世博中心&展览馆盛大召开。20日下午&#xff0c;一场围绕“全场景数据保护&#xff0c;护航数智化时代”的专题论坛举办&#xff0c;云和恩墨受邀参加&#xff0c;并期待与华为合…

【Linux的进程管理】

进程管理 Linux的进程进程的管理进程的状态不同状态的进程由不同的功能的链表进行管理Linux的进程切换和进程上下文进程调度抢占和非抢占式调度调度算法先来先服务CPU密集和I/O密集 最短作业优先调度算法高响应比优先调度算法时间片轮转调度算法时间片的长度设置 最高优先级调度…