數組铸董,集合

數組

val arrayOf = arrayOf(1, 2, 3)//[1,2,3]
val arrayOfNulls = arrayOfNulls<String>(5)//創(chuàng)建一個大小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提供的標準庫函數創(chuàng)建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)
關聯(lián)
//以原集合作為 鍵,創(chuàng)建一個相關聯(lián)的Map
val a = listOf("one", "two", "three", "four")
val associateWith = a.associateWith { it.length }
println(associateWith)
//以原集合作為 值作瞄,創(chuàng)建一個相關聯(lián)的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,用于后續(xù)的 對所有分組進行的操作德绿,比如 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)
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末个粱,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子稻薇,更是在濱河造成了極大的恐慌胶征,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件案狠,死亡現場離奇詭異钱雷,居然都是意外死亡,警方通過查閱死者的電腦和手機罩抗,發(fā)現死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進店門套蒂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來阱扬,“玉大人伸辟,你說我怎么就攤上這事⌒欧颍” “怎么了?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵警没,是天一觀的道長振湾。 經常有香客問我,道長树酪,這世上最難降的妖魔是什么大州? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任厦画,我火速辦了婚禮,結果婚禮上根暑,老公的妹妹穿的比我還像新娘。我一直安慰自己畸裳,他們只是感情好躏率,可當我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布民鼓。 她就那樣靜靜地躺著,像睡著了一般夯到。 火紅的嫁衣襯著肌膚如雪饮亏。 梳的紋絲不亂的頭發(fā)上阅爽,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天荐开,我揣著相機與錄音,去河邊找鬼百侧。 笑死能扒,一個胖子當著我的面吹牛,可吹牛的內容都是我干的初斑。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼砂竖,長吁一口氣:“原來是場噩夢啊……” “哼秦叛!你這毒婦竟也來了?” 一聲冷哼從身側響起三圆,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤避咆,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后路媚,有當地人在樹林里發(fā)現了一具尸體樊销,經...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年裤园,在試婚紗的時候發(fā)現自己被綠了拧揽。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡淤袜,死狀恐怖,靈堂內的尸體忽然破棺而出积蔚,到底是詐尸還是另有隱情蓖墅,我是刑警寧澤,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布教翩,位于F島的核電站贪壳,受9級特大地震影響,放射性物質發(fā)生泄漏闰靴。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一配猫、第九天 我趴在偏房一處隱蔽的房頂上張望杏死。 院中可真熱鬧,春花似錦腐巢、人聲如沸玄括。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至船殉,卻和暖如春热监,著一層夾襖步出監(jiān)牢的瞬間饮寞,已是汗流浹背列吼。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工苦始, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人理郑。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓咨油,卻偏偏與公主長得像,于是被迫代替她去往敵國和親赚爵。 傳聞我的和親對象是個殘疾皇子法瑟,可洞房花燭夜當晚...
    茶點故事閱讀 44,864評論 2 354

推薦閱讀更多精彩內容