65.集合常用操作

1.集合过滤

fun main(args: Array<String>) {
    val list1 = listOf<String>("张三", "李四", "王五", "找六", "张四", "李五", "李六")
    val list2 = listOf<String>("周芷若", "张无忌", "张五", "李善长", "林青霞", "李寻欢")

    //找到第一个集合中第一个姓张的
    println(list1.find { it.startsWith("张") })

    //把第一个集合中所有姓张的找出来
    println(list1.filter { it.startsWith("张") })

    //把两个集合中所有姓张的找出来并存放到一个集合中
    val mutableList = mutableListOf<String>()
    list1.filterTo(mutableList) { it.startsWith("张") }
    list2.filterTo(mutableList) { it.startsWith("张") }
    println(mutableList)

    //把第一个集合中下标为偶数的过滤出来
    println(list1.filterIndexed { index, value -> index % 2 == 0 })
}

2.集合排序

fun main(args: Array<String>) {
    val list = listOf<String>("a", "b", "e", "f", "c", "g", "d")
    //正序
    println(list.sorted())

    //倒序
    println(list.sortedDescending())


    val persons = listOf<Person>(Person("林青霞", 50), Person("张曼玉", 30), Person("柳岩", 70))
    //排序
    val sortedPerson = persons.sortedBy { it.age }
    println(sortedPerson)
    //倒序
    println(persons.sortedByDescending { it.age })

}

data class Person(val name: String, val age: Int)
  • sortedBy的实现如下:

image.png
可以看到sortedBy是一个Iterable的扩展函数,也是一个高阶函数,接收的参数selector是一个函数类型,然后这个函数的参数是集合类型T,返回值是泛型R,R是一个实现了Comparable接口的泛型类型,所以上面可以使用it.age

3.分组

fun main(args: Array<String>) {
    val list = listOf<String>("张三", "李四", "王五", "找六", "张四", "李五", "李六")
    //分组
    val map = list.groupBy {
        val first = it.substring(0, 1)
        when (first) {
            "张" -> "张"
            "李" -> "李"
            else -> "其它"
        }
    }
}
  • 输出结果如下:
image.png
  • groupBy源码分析:
    a

    b

    c
  • 调用顺序为a->b->c,通过图a可以看到groupBy接收一个参数为T,返回值为K的函数类型的参数,然后调用图b中的函数,同时给了一个 LinkedHashMap<K,MutableList<T>>作为第一个参数,看到图b的函数实现我们应该就明白了groupBy这个函数返回值k的作用了,继续看destination.getOrPut(key) { ArrayList<T>() },调用到图c,然后可以看到会从图a传递的LinkedHashMap<K,MutableList<T>>中通过key获取一个MutableList<T>,如果没有获取到,这个时候defaultValue: () -> V就起作用了,再看这个参数,原来是图b图c的过程中传递的 ArrayList<T>(),这样就形成了一个整体,根据key获取list,如果有就返回,如果没有则新创建一个,并且添加到LinkedHashMap<K,MutableList<T>>中,这样groupBy函数的返回值map就构建出来了
  • 图b中剩余的工作就是把遍历出来的元素添加到对应keylist中,最后并且返回图a中构造出来的LinkedHashMap<K,MutableList<T>>

4.最值

fun main(args: Array<String>) {
    val list = listOf<String>("a", "c", "b", "v", "f", "g", "e")

    //最大值
    println(list.max())
    //最小值
    println(list.min())


    val persons = listOf<Person>(Person("林青霞", 50), Person("张曼玉", 30), Person("柳岩", 70))
    //最大值
    println(persons.maxBy { it.age })
    //最小值
    println(persons.minBy { it.age })

}

data class Person(val name: String, val age: Int)
  • 具体的实现原理,与上面集合排序类似

5.去重复

fun main(args: Array<String>) {
    val list = listOf<String>("a", "c", "b", "v", "f", "g", "e", "a", "c")

    //去重复
    val toSet = list.toSet()
    println(toSet)

    println(list.distinct())

    val persons = listOf<Person>(
        Person("林青霞", 50), Person("张曼玉", 30), Person("柳岩", 70), Person("张三", 90),
        Person("张三", 20)
    )
    val distinctBy = persons.distinctBy { it.name.substring(0, 1) }
    println(distinctBy)

}

data class Person(val name: String, val age: Int)
  • 源码分析

distinctBy 的参数是一个函数类型,和上面情况一样

image.png

  • 可以看到去重主要是利用了HashSet,而HashSet主要是对HashMap做了一层封装,看到只有set.add(key)true的时候,才会将元素添加到集合中,HashSetadd函数调用的是HashMapput函数,看到HashMap的最终实现如下:
    a

    b
  • HashSetadd为true的时候表明return map.put(e, PRESENT)==null成立,看到b图中,只有添加的元素不存在,为新元素的时候才为true,再倒回去看,这样就去重成功了,平时我们开发的时候,也值得借鉴这种思想。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,670评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,928评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,926评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,238评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,112评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,138评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,545评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,232评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,496评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,596评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,369评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,226评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,600评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,906评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,185评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,516评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,721评论 2 335

推荐阅读更多精彩内容