Kotlin基础七之迭代


  在kotlin中,也有for(...)while (...)do {...} whlie(...)循环。只不过与其他的类C语言比较起来,又有些许不同:

fun main(args: Array<String>) {
    val languages = arrayListOf("c++",
            "Java", "Kotlin", "C", "Python")
    println("for loop: ")
    for (i in 0..(languages.size - 1)) {
        println(languages[i])
    }
    println("==========\ndo...while loop: ")
    var i = 0
    do {
        println(languages[i++])
    } while (i < languages.size)
    i = 0
    println("==========\nwhile loop: ")
    while (i < languages.size) {
        println(languages[i++])
    }
}
//result:
for loop: 
c++
Java
Kotlin
C
Python
==========
do...while loop: 
c++
Java
Kotlin
C
Python
==========
while loop: 
c++
Java
Kotlin
C
Python

Process finished with exit code 0

  在kotlin的for (...)中的形式并不是像Java那样的for (int i = 0; i < size; i++) {...},而是采用了for (i in [区间])的写法。有人问了,那要是递减或者有间隔的数怎么办,那好办:

fun main(args: Array<String>) {
    val languages = arrayListOf("c++",
            "Java", "Kotlin", "C", "Python")
    println("down for loop: ")
    for (i in (languages.size - 1) downTo  0) {
        println(languages[i])
    }
    println("down with step for loop: ")
    for (i in (languages.size - 1) downTo 0 step 2) {
        println(languages[i])
    }
}
//result:
down for loop: 
Python
C
Kotlin
Java
c++
down with step for loop: 
Python
Kotlin
c++

Process finished with exit code 0

  只要在for (...)里面加上加上downTo step关键字就可以了。其实for循环还可以这么用:

fun main(args: Array<String>) {
    val languages = arrayListOf("c++",
            "Java", "Kotlin", "C", "Python")
    println("for loop: ")
    for (i in languages.withIndex()) {
        println("index: ${i.index}, value: ${i.value}")
    }
}
//result:
for loop: 
index: 0, value: c++
index: 1, value: Java
index: 2, value: Kotlin
index: 3, value: C
index: 4, value: Python

Process finished with exit code 0

  在循环中,kotlin也支持传统的breakcontinue来控制循环。
  迭代map

fun main(args: Array<String>) {
    val binaryReps = TreeMap<Char, String>()//用TreeMap存储字母A到F的二进制和对应的字符串

    for (c in 'A'..'F') {//区间迭代
        val binary = Integer.toBinaryString(c.toInt())//转换成ASCII码二进制
        binaryReps[c] = binary//存入Map中
    }

    for ((letter, binary) in binaryReps) {//Map迭代访问,括号里左边是key右边是value
        println("$letter = $binary")
    }
}
//result:
A = 1000001
B = 1000010
C = 1000011
D = 1000100
E = 1000101
F = 1000110

Process finished with exit code 0