美文网首页
数组,集合

数组,集合

作者: lqhunter | 来源:发表于2020-08-27 18:49 被阅读0次

数组

val arrayOf = arrayOf(1, 2, 3)//[1,2,3]
val arrayOfNulls = arrayOfNulls<String>(5)//创建一个大小5,元素都为空的数组
val array = Array(5, { i -> i * 2 })
//最后一个参数是Lambda表达式时可以移出去
val array1 = Array(5) { i -> i * 2 }
原生类型数组

Kotlin 也有无装箱开销的专门的类来表示原生类型数组: ByteArray、 ShortArray、IntArray 等等

// 大小为 5、值为 [0, 0, 0, 0, 0] 的整型数组
val arr = IntArray(5)

// 例如:用常量初始化数组中的值
// 大小为 5、值为 [42, 42, 42, 42, 42] 的整型数组
val arr = IntArray(5) { 42 }

// 例如:使用 lambda 表达式初始化数组中的值
// 大小为 5、值为 [0, 1, 2, 3, 4] 的整型数组(值初始化为其索引值)
var arr = IntArray(5) { it * 1 }

集合

Kotlin 标准库提供了基本集合类型的实现: set、list 以及 map

  • List 是一个有序集合,可通过索引(反映元素位置的整数)访问元素。元素可以在 list 中出现多次。列表的一个示例是一句话:有一组字、这些字的顺序很重要并且字可以重复。
  • Set 是唯一元素的集合。它反映了集合(set)的数学抽象:一组无重复的对象。一般来说 set 中元素的顺序并不重要。例如,字母表是字母的集合(set)。
  • Map 是一组键值对。键是唯一的,每个键都刚好映射到一个值。值可以重复。map 对于存储对象之间的逻辑连接非常有用,例如,员工的 ID 与员工的位置。
接口图

List

由于List是一个接口,所以只能用kotlin提供的标准库函数创建list

//1.不可变 list
val a = listOf(1, 2, 3, "4")
val b = listOf<Int>(1, 2, 3, 4)

val array = arrayOf(1, 2, 3)
val c = listOf(array)

//2.不为空 list
val d = listOfNotNull(1, null, 3)//会自动去掉传入的null
println(d.size)
d.forEach(::print)

//3.可变 list
val aa = mutableListOf(1, 2, 3)
aa.add(4)
aa.forEach { println(it) }

//4
val d = arrayListOf(1, 2, 3)

Set

//1.不可变set
val a = setOf(1, 2, 3, 1, 2, 4)
a.forEach(::print)
println()

//2.可变set
val b = mutableSetOf("a", "b", "c")
b.forEach(::print)
println()
b.add("d")
b.forEach(::print)
println()
b.first()//可变set实现默认为 LinkHashSet

//3.HashSet
val c = hashSetOf(1, 2, 3)

//4.LinkedHashSet
val linkedSetOf = linkedSetOf(1, 2, 3)

//5.TreeSet
val e = sortedSetOf(5, 1, 8, 3)
e.forEach(::print)

Map

//1.不可变map
val a = mapOf(1 to "a", 2 to "b", 3 to "c")
//2.可变map
val b = mutableMapOf("a" to 1, "b" to 2)
b.put("c", 3)
b["c"] = 3
//3.HashMap
val c = hashSetOf(1 to "a", 2 to "b", 3 to "c")
//4.LinkedHashMap
val d = linkedMapOf(1 to "a", 2 to "b", 3 to "c")
//5.TreeMap
val e = sortedMapOf(2 to "b", 1 to "a", 3 to "c")
e.forEach(::println)

集合转换

映射
val a = listOf(1, 2, 3)
val b = a.map { it * 3 }
b.forEach(::print)
println()

//转换的过程中产生了null,mapNotNull可以过滤掉
val c = listOf(1, 2, 3)
val mapNotNull = c.mapNotNull {
    if (2 == it) null else it
}
mapNotNull.forEach(::print)
println()

val d = mapOf(1 to "a", 2 to "b", 3 to "c")
val mapKeys = d.mapKeys { it.key + 1 }//value不变,key变成对应值
mapKeys.forEach(::print)
println()

val mapValues = d.mapValues { it.value.toUpperCase() }//key不变,value变成对应值
mapValues.forEach(::print)
println()
合并
val colors = listOf("red", "brown", "grey")
val animals = listOf("fox", "bear", "wolf")
println(colors.zip(animals))
val twoAnimals = listOf("fox", "bear")
println(colors zip twoAnimals)
val a = listOf(1 to "a", 2 to "b", 3 to "c")
val unzip = a.unzip()
println(unzip)
关联
//以原集合作为 键,创建一个相关联的Map
val a = listOf("one", "two", "three", "four")
val associateWith = a.associateWith { it.length }
println(associateWith)
//以原集合作为 值,创建一个相关联的Map
val b = listOf("one", "two", "three", "four")
val associateBy = b.associateBy { b.indexOf(it) }
println(associateBy)
//Map 键和值都是通过集合元素生成的
val aa = listOf("1 a", "2 b", "3 c")
val associate = aa.associate {
    val split = it.split(" ")
    split[0] to split[1]
}
println(associate)
字符串表示
val numbers = listOf("1", "2", "3", "4", "5", "6", "7", "8")
println(numbers)
println(numbers.joinToString())
println(
    numbers.joinToString(
        separator = " ; ",
        prefix = "{",
        postfix = "}",
        limit = 5,
        truncated = "..."
    )
)
println(numbers.joinToString(
    separator = " ; ",
    prefix = "{",
    postfix = "}"
) {
    "${it}_${it}"
})
//joinTo返回 Appendable对象
val listString = StringBuffer("The list of numbers: ")
val joinTo = numbers.joinTo(listString)
joinTo.append("...")
println(listString)

过滤

过滤

对于 List 和 Set,过滤结果都是一个 List,对 Map 来说结果还是一个 Map

val aa = listOf(1, 2, 3, 4, 5, 6)
val filter = aa.filter { it > 3 }
println(filter)
val bb = mapOf("100" to 1, "101" to 2, "200" to 3, "201" to 4)
val filteredMap = bb.filter {
    it.key.startsWith("1") && it.value < 3
}
println(filteredMap)
//考虑元素在集合中位置中的过滤
val numbers = listOf("one", "two", "three", "four")
val filterIndexed = numbers.filterIndexed { index, s ->
    index > 1 && s.length > 4
}
println(filterIndexed)
//过滤某类的实例对象
val cc = listOf(1, "2", 3, null, "5")
val filterIsInstance = cc.filterIsInstance<String>()
println(filterIsInstance)
//过滤非空
val dd = listOf(1, 3, null)
val filterNotNull = dd.filterNotNull()
println(filterNotNull)

+/-操作符

  • +的结果包含原始集合 和 第二个操作数中的元素。
  • -的结果包含原始集合中的元素,但第二个操作数中的元素 除外。 如果第二个操作数是一个元素,那么 minus 移除其在原始集合中的 第一次 出现;如果是一个集合,那么移除其元素在原始集合中的 所有 出现
val numbers = listOf("one", "two", "three", "four")

val plusList = numbers + "five"
val minusList = numbers - listOf("three", "four")
println(plusList)
println(minusList)

分组

val numbers = listOf("one", "two", "three", "four", "five")
//返回一个Map,Map的key是 lambda 的结果, value是List, 对应的值是返回此结果key的元素
println(numbers.groupBy { it.first().toUpperCase() })
//返回一个Map,Map的key是keySelector的结果, value是List, 对应的值是返回此结果key的元素 通过valueTransform转换的结果
println(numbers.groupBy(keySelector = { it.first() }, valueTransform = { it + "66" }))
//获取一个 Grouping,用于后续的 对所有分组进行的操作,比如 fold reduce操作
val grouping = numbers.groupingBy { it.first() }
//eachCount
println(grouping.eachCount())
//fold,有初始值累积
val fold = grouping.fold("aaa") { sum, it ->
    "$sum-$it"
}
println(fold)
//reduce, 无初始值累积
val reduce = grouping.reduce { key, sum, it ->
    "$sum-$it-$key"
}
println(reduce)

取一部分

val numbers = listOf("one", "two", "three", "four", "five", "six")
//取指定索引
println(numbers.slice(1..3))
println(numbers.slice(0..4 step 2))
println(numbers.slice(setOf(3, 5, 0)))
//从头开始取3个
println(numbers.take(3))
//从尾取三个
println(numbers.takeLast(3))
//从头丢弃一个
println(numbers.drop(1))
//从尾丢弃5个
println(numbers.dropLast(5))

//分块
val list = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9)
println(list.chunked(3))

取单个元素

val numbers = linkedSetOf("one", "two", "three", "four", "five")
println(numbers.elementAt(0))
//第一个
numbers.first()
//最后一个
numbers.last()
//满足条件的第一个
numbers.first { it.startsWith("th") }
//避免超出索引范围导致异常
println(numbers.elementAtOrNull(5))
//索引超出范围,可以返回一个lambda表达式结果
println(numbers.elementAtOrElse(5) { "the index of $it is null" })

//随机取
val numbers = listOf(1, 2, 3, 4)
println(numbers.random())

//是否包含
println(numbers.contains("one"))
//可以使用 in 关键字以操作符的形式调用 contains()
println("one" in numbers)

相关文章

  • JavaSE总结(5)集合

    一、数组和集合: 数组 数组长度固定 数组可以存储任意类型元素 集合 集合长度可变 集合只能存储引用类型元...

  • 开发规范(2)

    集合转数组和数组转集合 使用集合转数组的方法,必须使用集合的 toArray(T[] array),传入的是类型完...

  • OC基础数据类型 - NSSet

    一 . 集合(NSSet) 和数组(NSArray)区别 集合和数组都是存储不同的对象的地址,但数组是有序的集合,...

  • 35.集合:集合概述、Collection集合体系特点、Coll

    集合 Collection、List、Set均为接口,其余为实现类 集合概述 集合与数组都是容器 数组的特点数组定...

  • Java的集合与数组的基本区别

    Java的集合与数组的基本区别 (一)数组 数组 用于存储基本数据类型,数组的长度固定。 (二)集合 集合类存放的...

  • Collection集合

    集合概述 集合和数组都是容器,他们有什么去别的? 集合和数组都是容器,可以存储多个数据 数组的长度是固定的。集合的...

  • iOS NSSet、NSMutableSet、NSIndexSe

    一、集合(NSSet)和数组(NSArray)区别 1、集合:集合(NSSet)和数组(NSArray)有相似之处...

  • 集合概述

    集合的概念: 集合的作用 与数组的对比-------为何选择集合而不是数组 集合框架的体系结构

  • Objective-C day5 集合(17-07-31)

    OC中的集合包括:数组类 字典类 集合类##数组:1.数组是一个有序的集合,OC中的数组只能存储对象类型,但是...

  • 集合Collection

    Collection  1.集合和数组的不同   集合有单列集合List,Set和双列集合Map,与数组相比,其没...

网友评论

      本文标题:数组,集合

      本文链接:https://www.haomeiwen.com/subject/kviydktx.html