Kotlin语言(七):数据结构

1、元组数据

fun main() {
    /**-------------------- 二元元组 --------------------*/
    val pair = Pair<String, Int>("张三", 20)
    println("(${pair.first}, ${pair.second})")
    //(张三, 20)

    val pair2 = "李四" to 25
    println("(${pair2.first}, ${pair2.second})")
    println(pair2.toString())
    //(李四, 25)

    /**-------------------- 三元元组 --------------------*/
    val triple = Triple<String, Int, Boolean>("王五", 18, true)
    println("(${triple.first}, ${triple.second}, ${triple.third})")
    println(triple.toString())
    //(王五, 18, true)
}

2、区间 Range

fun main() {
    /**-------------------- 1、区间定义 --------------------*/
    val range1: IntRange = 1..10
    val range2: IntRange = IntRange(1, 10)
    val range3: IntRange = 1.rangeTo(10)

    val range4: LongRange = 1L..10L
    val range5: LongRange = LongRange(1, 10)
    val range6: LongRange = 1L.rangeTo(10L)

    val range7: CharRange = 'a'..'z'
    val range8: CharRange = CharRange('a', 'z')
    val range9: CharRange = 'a'.rangeTo('z')

    //until 半开半闭区间
    val range: IntRange = 1 until 100 //[1, 100)


    /**-------------------- 2、区间遍历 --------------------*/
    for (i in range1) {
        print("$i ")
    }
    println()
    //1 2 3 4 5 6 7 8 9 10

    for((index, i) in range1.withIndex()){
        print("($index, $i) ")
    }
    println()
    //(0, 1) (1, 2) (2, 3) (3, 4) (4, 5) (5, 6) (6, 7) (7, 8) (8, 9) (9, 10)

    range1.forEach {
        print("$it ")
    }
    println()
    //1 2 3 4 5 6 7 8 9 10

    range1.forEachIndexed { index, i ->
        print("($index, $i) ")
    }
    println()
    //(0, 1) (1, 2) (2, 3) (3, 4) (4, 5) (5, 6) (6, 7) (7, 8) (8, 9) (9, 10)


    /**-------------------- 3、反向区间 --------------------*/
    val range10: IntProgression = 10 downTo 1
    range10.forEach {
        print("$it ")
    }
    println()
    //10 9 8 7 6 5 4 3 2 1

    val range11: LongProgression = 10L downTo 1L
    range11.forEach {
        print("$it ")
    }
    println()
    //10 9 8 7 6 5 4 3 2 1

    val range12: CharProgression = 'f' downTo 'a'
    range12.forEach {
        print("$it ")
    }
    println()
    //f e d c b a


    /**-------------------- 4、区间反转 --------------------*/
    val range13 = range1.reversed()
    range13.forEach {
        print("$it ")
    }
    println()
    //10 9 8 7 6 5 4 3 2 1


    /**-------------------- 5、区间步长 --------------------*/
    val range14 = 1..100 step 10
    val range15 = IntRange(1, 100) step 10
    val range16 = 1.rangeTo(100) step 10
    val range17 = 100 downTo 1 step 10
    val range18 = range1.reversed() step 10
    range14.forEach {
        print("$it ")
    }
    println()
    //1 11 21 31 41 51 61 71 81 91

    //for 循环里面也可以使用 step 步长
    for (i in range1 step 2){
        print("$i ")
    }
    println()
    //1 3 5 7 9
}

3、数组 Array

fun main() {
    /**-------------------- 1.数组定义 --------------------*/
    //(1)使用 arrayOf 创建
    val arr0: Array<String> = arrayOf("张三", "李四", "王五")
    val arr1: Array<Int> = arrayOf(10, 20, 30)
    val arr2: Array<Char> = arrayOf('a', 'b', 'c')
    val arr3: Array<Any> = arrayOf("张三", 10, 'a')

    //(2)使用构造函数创建具体类型和容量的数组
    val intArray = IntArray(4)
    val intArray1 = IntArray(4) { 0 }//数组长度为4并且全部初始化为0
    val booleanArray = BooleanArray(4)
    val byteArray = ByteArray(4)
    val shortArray = ShortArray(4)
    val charArray = CharArray(4)
    val floatArray = FloatArray(4)
    val doubleArray = DoubleArray(4)
    val longArray = LongArray(4)

    //注:除八大基本数据类型之外的对象数据类型只能通过 arrayOf 创建,例如 String 数组


    /**-------------------- 2.数组的遍历 --------------------*/
    for (s in arr0) {
        print("$s ")
    }
    println()
    //张三 李四 王五

    for ((index, s) in arr0.withIndex()) {
        print("($index, $s) ")
    }
    println()
    //(0, 张三) (1, 李四) (2, 王五)

    arr3.forEach {
        print("$it ")
    }
    println()

    //张三 10 a
    arr3.forEachIndexed { index, s ->
        print("($index, $s) ")
    }
    println()
    //(0, 张三) (1, 10) (2, a)


    /**-------------------- 3.数组元素的获取 --------------------*/
    val temp0 = arr0.get(0)
    val temp1 = arr0[0]
    println("temp0=$temp0 temp1=$temp1")


    /**-------------------- 4.数组元素的修改 --------------------*/
    arr0[0] = "马六"
    arr0.set(1, "何七")
    arr0.forEach {
        print("$it ")
    }
    println()
    //马六 何七 王五


    /**-------------------- 5.其他 api --------------------*/
    val array = arrayOf("张三", "李四", "王五", "张三", "李四", "王五")
    //(1)返回第一个匹配元素的角标,如果没有找到则返回-1
    val index11 = array.indexOf("张三")
    val index12 = array.indexOf("马六")
    println("index11=$index11 index12=$index12")
    //index11=0 index12=-1

    //(2)返回最后一个匹配元素的角标,如果没有找到则返回-1
    val index21 = array.lastIndexOf("张三")
    val index22 = array.lastIndexOf("马六")
    println("index21=$index21 index22=$index22")
    //index21=3 index22=-1

    //(3)返回满足规则的第一个元素的角标,如果没有则返回-1
    val index31 = array.indexOfFirst {
        it.startsWith("张")
    }
    val index32 = array.indexOfFirst {
        it.startsWith("马")
    }
    println("index31=$index31 index32=$index32")
    //index31=0 index32=-1

    //(4)返回满足规则的最后一个元素的角标,如果没有则返回-1
    val index41 = array.indexOfLast {
        it.startsWith("张")
    }
    val index42 = array.indexOfLast {
        it.startsWith("马")
    }
    println("index41=$index41 index42=$index42")
    //index41=3 index42=-1
}

4、枚举 enum

enum class Week {
    Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday
}

fun todo(week: Week) {
    when (week) {
        in Week.Monday..Week.Friday -> println("上班")
        else -> println("休息")
    }
}


enum class Color(var r: Int, var g: Int, var b: Int) {
    Red(255, 0, 0),
    Green(0, 255, 0),
    Blue(0, 0, 255)
}

fun main() {
    println(Week.Monday)  // Monday
    // ordinal 枚举常数的序数(它在枚举声明中的位置,初始序数为0)
    Week.values().forEach { println("${it.ordinal} -> $it") }

    todo(Week.Wednesday) // 上班
    todo(Week.Sunday)    // 休息


    println("${Color.Red}[${Color.Red.r}, ${Color.Red.g}, ${Color.Red.b}]")
    // Red[255, 0, 0,]
}

5、数据类 data

/**
 * 数据类:
 * 1、使用关键字 data 定义数据类
 * 2、会自动生成 构造函数、get、set、toString、hashCode、equals、copy、component
 */
data class News(var title: String, var desc: String, var image: String, var content: String)

fun main() {
    val news = News("标题", "描述", "图片", "内容")
    println(news.title)      // 标题
    println(news.desc)       // 描述
    println(news.image)      // 图片
    println(news.content)    // 内容
    println(news.toString()) // News(title=标题, desc=描述, image=图片, content=内容)
    println(news.hashCode()) // 807819163

    val newsCopy = news.copy()
    println(newsCopy.toString()) // News(title=标题, desc=描述, image=图片, content=内容)
    val newsCopyChange = news.copy("王者荣耀")
    println(newsCopyChange.toString()) //News(title=王者荣耀, desc=描述, image=图片, content=内容)

    println(news == newsCopy)  // true
    println(news === newsCopy) // false

    println(news.component1()) // 标题    java: public final String component1() {return this.title;}
    println(news.component2()) // 描述    java: public final String component1() {return this.desc;}
    println(news.component3()) // 图片    java: public final String component1() {return this.image;}
    println(news.component4()) // 内容    java: public final String component1() {return this.content;}

    // 解构
    val (title, desc, image, content) = news
    println(title)    // 标题
    println(desc)     // 描述
    println(image)    // 图片
    println(content)  // 内容
}

6、密封类 sealed

/**
 * 密封类 sealed:封装的是类型
 */
sealed class NedStark {
    class RobStark : NedStark()
    class SansaStark : NedStark()
    class AryaStark : NedStark()
    class BrandonStark : NedStark()
}

class JonSnow : NedStark()

/**
 * 判断有没有继承权
 */
fun hasRight(stark: NedStark): Boolean {
    return when (stark) {
        is NedStark.RobStark -> true
        is NedStark.SansaStark -> true
        is NedStark.AryaStark -> true
        is NedStark.BrandonStark -> true
        else -> false
    }
}

fun main() {
    val stark1 = NedStark.RobStark()
    println(hasRight(stark1)) // true

    val stark2 = JonSnow()
    println(hasRight(stark2)) // false
}

7、List 集合

fun main() {
    // 1、不可变 list
    val list = listOf("毛晓彤", "林青霞", "赵露思", "毛晓彤", "毛晓彤")
    println(list)                                // [毛晓彤, 林青霞, 赵露思, 毛晓彤, 毛晓彤]
    println(list[0])                             // 毛晓彤
    println(list.indexOf("毛晓彤"))               // 0
    println(list.lastIndexOf("毛晓彤"))  // 4
    println(list.first())                        // 毛晓彤
    println(list.last())                         // 毛晓彤
    println(list.contains("赵露思"))              // true
    println(list.subList(1, 3))                  // [林青霞, 赵露思]
    println(list.size)                           // 5
    println(list.lastIndex)                      // 4
    println(list.asReversed())                   // [毛晓彤, 毛晓彤, 赵露思, 林青霞, 毛晓彤]

    val list2 = List(4) { index -> index * 2 }
    println(list2)                  // [0, 2, 4, 6]
    println(list2.binarySearch(4))  // 2

    // 2、可变 list
    val mutableList = mutableListOf("林青霞", "赵露思", "毛晓彤")
    println(mutableList)       //[林青霞, 赵露思, 毛晓彤]
    mutableList.add("金晨")
    println(mutableList)       //[林青霞, 赵露思, 毛晓彤, 金晨]
    mutableList.forEach { println(it) }
    val mutableList2 = MutableList<Int>(3) { index -> index * index }
    println(mutableList2)      //[0, 1, 4]

    // 3、java 中的 list
    val arrList = ArrayList<String>()
    val arrList1 = arrayListOf<String>()
    val linkList = LinkedList<String>()
}

8、Set 集合

fun main() {
    // 1.不可变 set
    val set = setOf("A", "B", "A")
    println(set)  // [A, B]

    // 2.可变 set
    val mutableSet = mutableSetOf("A", "B", "A")
    println(mutableSet)  // [A, B]
    mutableSet.add("C")
    println(mutableSet)  // [A, B, C]

    val hashSet = hashSetOf("A", "B", "A")
    println(hashSet)   //[A, B]
    hashSet.add("C")
    println(hashSet)   //[A, B, C]

    val linkSet = linkedSetOf("A", "B", "A")
    println(linkSet)   //[A, B]
    linkSet.add("C")
    println(linkSet)   //[A, B, C]

    // 3.相关接口
    println(set.size)
    set.forEach {
        println(it)
    }
    set.contains("A")
    println(set.isEmpty())
    println(set.indexOf("B"))
    println(set.last())
    println(set.first())
    println(set.reversed())

    //4.java 中的 set 集合
    val s1 = HashSet<String>()
    val s2 = LinkedHashSet<String>()
    val s3 = TreeSet<String>()
}

9、Map 集合

fun main() {
    // 1.不可变 Map
    val map = mapOf("A" to 1, "B" to 2, "C" to 3)
    println(map)         // {A=1, B=2, C=3}

    // 2.可变 Map
    val mutableMap = mutableMapOf("A" to 1, "B" to 2, "C" to 3)
    println(mutableMap)  // {A=1, B=2, C=3}
    mutableMap.put("D", 4)
    println(mutableMap)  // {A=1, B=2, C=3, D=4}

    val hashMap = hashMapOf("A" to 1, "B" to 2, "C" to 3)
    println(hashMap)     // {A=1, B=2, C=3}
    mutableMap.put("D", 4)
    println(mutableMap)  // {A=1, B=2, C=3, D=4}

    val linkedMap = linkedMapOf("A" to 1, "B" to 2, "C" to 3)
    println(linkedMap)   // {A=1, B=2, C=3}
    mutableMap["D"] = 4
    println(mutableMap)  // {A=1, B=2, C=3, D=4}
    mutableMap["A"] = 5
    println(mutableMap)  // {A=5, B=2, C=3, D=4}

    // 3.相关接口
    mutableMap["B"] = 11
    println(mutableMap)        // {A=5, B=11, C=3, D=4}
    println(mutableMap["B"])   // 11
    println(mutableMap.keys)   // [A, B, C, D]
    println(mutableMap.values) // [5, 11, 3, 4]
    for ((key, value) in mutableMap) {
        println("{$key = $value}")
    }
    mutableMap.forEach { t, u ->
        println("{$t = $u}")
    }

    // 4.java 中的 Map
    val m1 = HashMap<String, Int>()
    val m2 = LinkedHashMap<String, Int>()
    val m3 = TreeMap<String, Int>()
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,718评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,683评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,207评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,755评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,862评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,050评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,136评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,882评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,330评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,651评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,789评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,477评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,135评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,864评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,099评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,598评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,697评论 2 351

推荐阅读更多精彩内容

  • 概述 Kotlin是面向对象的静态类型语言; 在Kotlin中,所有东西都是对象,在这个意义上可以在任意变量上调用...
    CodeMagic阅读 387评论 0 0
  • Swift001-数据类型 元组 枚举 结构体 Swift 包含了 Objective-C 上所有基本数据类型,另...
    DDY阅读 645评论 0 0
  • 前言 人生苦多,快来 Kotlin ,快速学习Kotlin! 什么是Kotlin? Kotlin 是种静态类型编程...
    任半生嚣狂阅读 26,175评论 9 118
  • 自从实习结束后直到现在将近一年多的时间再也没有用过kotlin, 在今年五月份I/O大会上,Google再次明确了...
    Scus阅读 1,364评论 0 0
  • 在现实中经常需要处理大量同类的数据,如果一个一个表示就太麻烦了,如能“一组一组”表示会方便很多。于是就有了“数组”...
    码园老农阅读 902评论 0 0