Kotlin入门(7)循环语句的操作
上一篇文章介绍了简单分支与多路分支的实现,控制语句除了这两种条件分支之外,还有对循环处理的控制,那么本文接下来继续阐述Kotlin如何对循环语句进行操作。
Koltin处理循环语句依旧采纳了for和while关键字,只是在具体用法上有所微调。首先来看for循环,Java遍历某个队列,可以通过“for (item : list)”形式的语句进行循环操作。同样Kotlin也能使用类似形式的循环,区别在于把冒号“:”换成了关键字“in”,具体语句形如“for (item in list)”。下面是Kotlin对数组进行循环处理的代码例子:
val poemArray:Array<String> = arrayOf("朝辞白帝彩云间", "千里江陵一日还", "两岸猿声啼不住", "轻舟已过万重山")
btn_repeat_item.setOnClickListener {
var poem:String=""
for (item in poemArray) {
poem = "$poem$item,\n"
}
tv_poem_content.text = poem
}
上述代码的目的是将一个诗句数组用逗号与换行符拼接起来,以便在界面上展示完整的诗歌内容。拼接后的诗歌显示界面如下图所示:
注意到截图中每行诗句都以逗号结尾,这有个句点问题,因为每首绝句的第一、三行末尾才是逗号,第二、四行的末尾应该是句号;所以这个循环代码得加以改进,补充对数组下标的判断,如果当前是奇数行,则末尾加逗号;如果当前是偶数行,则末尾加句号。倘若使用Java编码,要是涉及到下标的循环,基本采取“for (初始的赋值语句; 满足循环的条件判断; 每次循环之后的增减语句)”这般形式,具体实现可参考以下的示例代码:
for (int i=0; i<array.length; i++) {
...
}
出人意料的是,Kotlin废除了“for (初始; 条件; 增减)”这个规则;若想实现上述功能,取而代之的,则为“for (i in array.indices)”语句,其中indices表示该数组对象的下标数组,每次循环都从下标数组依次取出当前元素的下标。根据该规则判断下标的数值,再分别在句尾添加逗号与句号,改造后的Kotlin代码如下所示:
btn_repeat_subscript.setOnClickListener {
var poem:String=""
for (i in poemArray.indices) {
if (i%2 == 0) {
poem = "$poem${poemArray[i]},\n"
} else {
poem = "$poem${poemArray[i]}。\n"
}
}
tv_poem_content.text = poem
}
正确补充标点的诗歌显示界面如下图所示:
然而取消“for (初始; 条件; 增减)”这个规则是有代价的,因为实际开发中往往存在非同一般的需求,比如以下几种情况,Kotlin的“for (i in array.indices)”语句就无法很好地处理:
1、如何设定条件判断的起始值和终止值?
2、每次循环之后的递增值不是1的时候要怎么办?
3、循环方向不是递增而是递减,又如何是好?
4、与条件判断有关的变量不止一个,咋整?
5、循环过程中的变量,在循环结束后还能不能使用?
针对以上情况,其实Kotlin也给出了几个解决办法,代价是多了几个诸如until、step、downTo这样的关键字,具体用法见下列代码:
// 左闭右开区间,合法值包括11,但不包括66
for (i in 11 until 66) { ... }
// 每次默认递增1,这里改为每次递增4
for (i in 23..89 step 4) { ... }
// for循环默认递增,这里使用downTo表示递减
for (i in 50 downTo 7) { ... }
可是这些解决办法并不完美,因为业务需求是千变万化的,并非限定在几种固定模式。同时,以上规则容易使人混淆,一旦没搞清楚until和downTo的开闭区间,在判断边界值时会产生问题。所以更灵活的解决方案是,起止数值、条件判断、循环方向与递增值都应当在代码中明确指定,“for (初始; 条件; 增减)”这个规则固然废除了,但开发者依旧能够使用while语句实现相关功能,Kotlin的while循环与Java的处理是一致的,下面是使用while进行循环判断的代码例子:
btn_repeat_begin.setOnClickListener {
var poem:String=""
var i:Int = 0
while (i < poemArray.size) {
if (i%2 ==0) {
poem = "$poem${poemArray[i]},\n"
} else {
poem = "$poem${poemArray[i]}。\n"
}
i++
}
poem = "${poem}该诗歌一共有${i}句。"
tv_poem_content.text = poem
}
既然while语句保留了下来,do/while语句继续保留,写法也没什么变化,采用do/while写法的代码如下所示:
btn_repeat_end.setOnClickListener {
var poem:String=""
var i:Int = 0
do {
if (i%2 ==0) {
poem = "$poem${poemArray[i]},\n"
} else {
poem = "$poem${poemArray[i]}。\n"
}
i++
} while (i < poemArray.size)
poem = "${poem}该诗歌一共有${i}句。"
tv_poem_content.text = poem
}
前面的循环处理其实都还中规中矩,只有内忧没有外患,但要是数组里的诗句本身就不完善,比如有空指针、有空串、有空格串、有多余串等等,此时就得进行诗句的合法性判断,如此方可输出正常的诗歌文字。合法性判断主要由两块代码组成:
1、如果发现有空指针、有空串、有空格串,则忽略此行,即使用关键字continue继续下个循环;
2、如果合法诗句达到四句,则不管是否遍历完成,直接拼好绝句并结束循环,即使用关键字break跳出循环;
加入了合法性判断的代码见下,主要演示了continue和break:
val poem2Array:Array<String?> = arrayOf("朝辞白帝彩云间", null, "千里江陵一日还", "", "两岸猿声啼不住", " ", "轻舟已过万重山", "送孟浩然之广陵")
btn_repeat_continue.setOnClickListener {
var poem:String=""
var pos:Int=-1
var count:Int=0
while (pos <= poem2Array.size) {
pos++
if (poem2Array[pos].isNullOrBlank())
continue
if (count%2 ==0) {
poem = "$poem${poem2Array[pos]},\n"
} else {
poem = "$poem${poem2Array[pos]}。\n"
}
count++
if (count == 4)
break
}
tv_poem_content.text = poem
}
看来合法性判断用到的continue和break,Kotlin并没有做什么改进呀?这是真的吗?如果是真的,那真是图样图森破。以往我们操作多层循环的时候,有时在内层循环发现某种状况,就得跳出包括外层循环在内的整个循环。例如遍历诗歌数组,一旦在某个诗句中找到“一”字,便迅速告知外界“我中奖啦”之类的欢呼。可是这里有两层循环,如果使用Java编码,只能先跳出内层循环,然后外层循环通过判断标志位再决定是否跳出,而不能从内层循环直接跳出外层循环。现在Kotlin大笔一挥,干嘛这么麻烦,咱想跳到哪里就跳到哪里,只消给外层循环加个@标记,接着遇到情况便直接跳出到这个标记,犹如孙悟空蹦上筋斗云,想去哪就去哪,多方便。这个创意真好,省事省力省心,赶紧看看下面代码是怎么实现的:
btn_repeat_break.setOnClickListener {
var i:Int = 0
var is_found = false
outside@ while (i < poemArray.size) {
var j:Int = 0
var item = poemArray[i];
while ( j < item.length) {
if (item[j] == '一') {
is_found = true
break@outside
}
j++
}
// //如果内层循环直接跳出两层循环,那么下面的判断语句就不需要了
// if (is_found)
// break
i++
}
tv_poem_content.text = if (is_found) "我找到'一'字啦" else "没有找到'一'字呀"
}
总结一下,对于循环语句的操作,Kotlin仍然保留了for和while两种循环,主要区别在于:Kotlin取消了“for (初始; 条件; 增减)”这个规则,不过新增了对跳出多重循环的支持(通过“break@标记位”实现)。
__________________________________________________________________________
本文现已同步发布到微信公众号“老欧说安卓”,打开微信扫一扫下面的二维码,或者直接搜索公众号“老欧说安卓”添加关注,更快更方便地阅读技术干货。
Kotlin入门(7)循环语句的操作的更多相关文章
- Kotlin入门第二课:集合操作
测试项目Github地址: KotlinForJava 前文传送: Kotlin入门第一课:从对比Java开始 初次尝试用Kotlin实现Android项目 1. 介绍 作为Kotlin入门的第二课, ...
- Swift入门篇-循环语句
今天早上一起来所有新闻都是报道荷兰5-1战胜西班牙,我一看没有搞错吧,顿时想都如果中国队vs荷兰队也不至于会输的怎么惨吧,难道是荷兰队开挂了,于是我看了一下昨天比赛的视频直播,还真是新闻报道的那样,顿 ...
- Python趣味入门5:循环语句while
跟着小牛叔,找准正确编程入门姿势,每天只要阅读10分钟. 任何语言都有循环语句,在Python里循环更是变化无穷,有基本的循环,有循环else语句,引伸出来的还有迭代器.推导式,咱们先学习最简单的一种 ...
- python入门10 循环语句
两种循环: 1 for in 2 while #coding:utf-8 #/usr/bin/python """ 2018-11-03 dinghanhua 循环语句 ...
- 05 . Python入门值循环语句
一.Python循环语句 程序一般情况下是按照顺序执行的 编程语言提供了各种控制结构,允许更复杂的执行路径 Python中的循环语句有for和while但没有do while 循环语句允许我们执行一个 ...
- Shell - 简明Shell入门06 - 循环语句(Loop)
示例脚本及注释 #!/bin/bash # for循环 for filename in t1 t2 t3 do touch $filename.txt echo "Create new fi ...
- Kotlin入门教程——目录索引
Kotlin是谷歌官方认可的Android开发语言,Android Studio从3.0版本开始就内置了Kotlin,所以未来在App开发中Kotlin取代Java是大势所趋,就像当初Android ...
- Kotlin入门(8)空值的判断与处理
上一篇文章介绍了如何对循环语句进行操作,末尾还演示了发现空串时直接继续下一循环,只是在初始化字符串数组时使用了“val poem2Array:Array<String?> = ***”,该 ...
- Javascript入门(五)数组操作、循环语句
一.数组与数组操作 <script type="text/javascript"> //数组定义方式 var list1 = new Array(1,2,3); var ...
随机推荐
- Network - 互联网协议简介
珠玉在前,不在赘言 互联网协议入门(一) 互联网协议入门(二) 通信协议:HTTP.TCP.UDP 互联网协议入门 互联网协议入门深入 当你输入一个网址,实际会发生什么? Wireshark基本介绍和 ...
- Mac-让 Finder 显示隐藏文件和文件夹
打开「终端」,输入以下内容,然后「Return」键,这样就把隐藏的文件和文件夹显示了: defaults write com.apple.finder AppleShowAllFiles -boole ...
- Java RMI 概观
RMI是Java的一组拥护开发分布式应用程序的API. RMI使用Java语言接口定义了远程对象,它集合了Java序列化和Java远程方法协议(Java Remote Method Protocol) ...
- 《Kubernetes权威指南》——Kubelet运行机制与安全机制
1 Kubelet运行机制 Kubenetes集群中的每个Node节点都会启动一个Kubelet服务进程用于处理Master下发到该节点的任务,管理Pod及其中的容器 Kubelet进程在API Se ...
- TCP/IP 笔记 - 地址解析协议
地址解析协议(ARP)提供了一种在IPv4地址和各种网络技术使用的硬件地址之间的映射.ARP仅用于IPv4,IPv6使用邻居发现协议,它被合并入ICMPv6.地址解析是发现两个地址之间的映射关系的过程 ...
- Django内置权限扩展案例
当Django的内置权限无法满足需求的时候就自己扩展吧~ 背景介绍 overmind项目使用了Django内置的权限系统,Django内置权限系统基于model层做控制,新的model创建后会默认新建 ...
- 实验吧 burpsuie拦截修改请求
Forbidden 解题链接:http://ctf5.shiyanbar.com/basic/header/ 把language改成zh-hk,go,flag到手 Forms 题目地址:http:// ...
- Django学习(5)优雅地分页展示网页
在我们平时浏览网页时,经常会遇到网页里条目很多的情形,这时就会用到分页展示的功能.那么,在Django中,是如何实现网页分类的功能的呢?答案是Paginator类. 本次分享讲具体展示如何利用Djan ...
- easyui datagrid 禁止选中行
没有找到可以直接禁止的属性,但是找到两个间接禁止的方式. 方式一: //onClickRow: function (rowIndex, rowData) { // $(this).datagr ...
- 数据库设计---PowerDesigner(物理模型和概念模型)
内容 第一种方法:概念模型转物理模型 1.首先新建模型--选择概念模型(CDM) 2.新建实体(学生和卡),设置相应的属性 3.一共四种关系(1:1,1:n,n:1,n:n),根据 ...