9-bo‘lim

Kolleksiyalar

List, Set va Map, o'zgaruvchan va o'zgarmas shakllari, massivlar va nega Kotlin da ikki xil kolleksiya turi bor.

🕑 13 daqiqa o‘qish 📄 566 so‘z 👁 0 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. List
  2. MutableList
  3. Set - takrorlanmas to'plam
  4. Map - kalit va qiymat
  5. MutableMap
  6. Map bo'ylab yurish
  7. Ikki xil tur - nega
  8. Massivlar
  9. Kolleksiyalarni aylantirish
  10. Bo'sh kolleksiyalar
  11. Xulosa

Kotlin da uchta asosiy kolleksiya bor: ro'yxat, to'plam va lug'at. Har birining ikki ko'rinishi mavjud - o'zgarmas va o'zgaruvchan.

List #

KOTLIN
fun main() {
    val shaharlar = listOf("Namangan", "Andijon", "Farg'ona")

    println(shaharlar)
    println(shaharlar.size)
    println(shaharlar[0])
    println(shaharlar.first())
    println(shaharlar.last())
    println("Andijon" in shaharlar)
    println(shaharlar.indexOf("Farg'ona"))
}
Natija
[Namangan, Andijon, Farg'ona]
3
Namangan
Namangan
Farg'ona
true
2

listOf o'zgarmas ro'yxat yaratadi - unga element qo'shib bo'lmaydi.

KOTLIN
val shaharlar = listOf("Namangan")
shaharlar.add("Andijon")    // error: unresolved reference: add

MutableList #

KOTLIN
fun main() {
    val royxat = mutableListOf("Namangan", "Andijon")

    royxat.add("Farg'ona")
    royxat.add(1, "Qo'qon")
    royxat.remove("Andijon")
    royxat[0] = "NAMANGAN"

    println(royxat)
    println(royxat.size)

    royxat.removeAt(0)
    println(royxat)

    royxat.clear()
    println(royxat.isEmpty())
}
Natija
[NAMANGAN, Qo'qon, Farg'ona]
3
[Qo'qon, Farg'ona]
true
MetodNima qiladi
add(x)Oxiriga qo'shadi
add(i, x)Ko'rsatilgan joyga
remove(x)Qiymat bo'yicha o'chiradi
removeAt(i)Indeks bo'yicha
clear()Hammasini o'chiradi
[i] = xAlmashtiradi
Doim listOf dan boshlang

Bu val va var bilan bir xil mantiq: o'zgarmasdan boshlang, o'zgartirish kerak bo'lgandagina mutableListOf ga o'ting.

O'zgarmas ro'yxat haqida o'ylash oson - uni kimdir kutilmaganda o'zgartirib qo'yishi mumkin emas. Ayniqsa funksiyaga uzatganda bu muhim.

val listasi ham o'zgarishi mumkin

Diqqat qiling - yuqoridagi misolda val royxat edi, lekin elementlar o'zgardi!

val havolani qotiradi, ro'yxatning ichini emas:

KOTLIN
val a = mutableListOf(1, 2)
a.add(3)        // to'g'ri - ichi o'zgardi
a = mutableListOf()   // xato - havola o'zgarmaydi

Ichi o'zgarmasligi kerak bo'lsa, listOf ishlating.

Set - takrorlanmas to'plam #

KOTLIN
fun main() {
    val harflar = setOf("a", "b", "a", "c", "b")

    println(harflar)
    println(harflar.size)
    println("a" in harflar)

    val sonlar = listOf(1, 2, 2, 3, 3, 3)
    println(sonlar.toSet())
    println(sonlar.distinct())

    val a = setOf(1, 2, 3)
    val b = setOf(3, 4, 5)
    println(a + b)
    println(a intersect b)
    println(a subtract b)
}
Natija
[a, b, c]
3
true
[1, 2, 3]
[1, 2, 3]
[1, 2, 3, 4, 5]
[3]
[1, 2]

Set takrorlarni o'zi tashlaydi. toSet() va distinct() - ro'yxatdan takrorlarni olib tashlashning ikki yo'li (ikkinchisi ro'yxat qaytaradi va tartibni saqlaydi).

Map - kalit va qiymat #

KOTLIN
fun main() {
    val poytaxtlar = mapOf(
        "O'zbekiston" to "Toshkent",
        "Qozog'iston" to "Ostona",
        "Qirg'iziston" to "Bishkek"
    )

    println(poytaxtlar["O'zbekiston"])
    println(poytaxtlar["Tojikiston"])
    println(poytaxtlar.size)
    println(poytaxtlar.containsKey("Qozog'iston"))
    println(poytaxtlar.keys)
    println(poytaxtlar.values)
}
Natija
Toshkent
null
3
true
[O'zbekiston, Qozog'iston, Qirg'iziston]
[Toshkent, Ostona, Bishkek]

kalit to qiymat - juftlik yaratishning qulay shakli. to - bu aslida funksiya, lekin infiks shaklda yozilgani uchun gap kabi o'qiladi.

Diqqat: mavjud bo'lmagan kalit uchun null qaytdi - xato chiqmadi. Bu Java dan farqli va ancha xavfsiz.

MutableMap #

KOTLIN
fun main() {
    val narxlar = mutableMapOf("olma" to 12000, "anor" to 18000)

    narxlar["uzum"] = 22000
    narxlar["olma"] = 13000
    narxlar.remove("anor")

    println(narxlar)
    println(narxlar.getOrDefault("banan", 0))
    println(narxlar.getOrElse("banan") { -1 })

    narxlar.getOrPut("shaftoli") { 9500 }
    println(narxlar["shaftoli"])
}
Natija
{olma=13000, uzum=22000}
0
-1
9500

getOrPut - "bo'lsa ol, bo'lmasa hisoblab qo'y va qaytar". Keshlash uchun juda qulay.

Map bo'ylab yurish #

KOTLIN
fun main() {
    val ballar = mapOf("Malika" to 88, "Husanboy" to 92, "Aziza" to 95)

    for ((ism, ball) in ballar) {
        println("$ism: $ball")
    }

    println("---")

    ballar.forEach { (ism, ball) ->
        println("$ism -> $ball")
    }
}
Natija
Malika: 88
Husanboy: 92
Aziza: 95
---
Malika -> 88
Husanboy -> 92
Aziza -> 95
mapOf tartibni saqlaydi

Yuqoridagi natijada elementlar aynan yozilgan tartibda chiqdi.

Buning sababi: mapOf aslida LinkedHashMap yaratadi va u qo'shilish tartibini eslab qoladi.

Lekin bunga tayanmang. Bu hujjatlashtirilgan kafolat emas, shunchaki hozirgi amalga oshirish tafsiloti. Tartib muhim bo'lsa, toSortedMap() yoki sortedBy bilan aniq saralang.

Ikki xil tur - nega #

Kotlin kolleksiyalari List / Set / Map faqat o'qish - add, remove yo'q MutableList / Set / Map o'zgartirish mumkin meros MutableList - List ning vorisi. Ya'ni MutableList kerak bo'lgan joyda List ni berib bo'lmaydi, lekin teskarisi mumkin. Funksiya parametrida List yozing - shunda chaqiruvchi ikkalasini ham bera oladi
O'zgarmas tur - niyatni bildirish usuli
KOTLIN
fun jami(sonlar: List<Int>): Int = sonlar.sum()

fun main() {
    val ozgarmas = listOf(1, 2, 3)
    val ozgaruvchan = mutableListOf(4, 5, 6)

    println(jami(ozgarmas))
    println(jami(ozgaruvchan))
}
Natija
6
15

Parametr List deb yozilgani uchun funksiya ikkalasini ham qabul qildi - lekin ichida o'zgartira olmaydi.

Massivlar #

KOTLIN
fun main() {
    val sonlar = intArrayOf(5, 10, 15)
    val ismlar = arrayOf("Malika", "Aziza")
    val bosh = IntArray(3)
    val toldirilgan = IntArray(3) { it * 10 }

    println(sonlar.joinToString(", "))
    println(ismlar.joinToString(", "))
    println(bosh.joinToString(", "))
    println(toldirilgan.joinToString(", "))
    println(sonlar.size)
    println(sonlar[1])
}
Natija
5, 10, 15
Malika, Aziza
0, 0, 0
0, 10, 20
3
10
Massiv emas, List ishlating

Kotlin da massiv kamdan-kam kerak bo'ladi. List qulayroq va xavfsizroq.

Massiv faqat uch holatda kerak:

  1. Java kutubxonasi aynan massiv talab qilganda.
  2. vararg parametrlar bilan ishlaganda.
  3. Juda katta hajmdagi sonlar ustida tezlik muhim bo'lganda (IntArray "quti"siz saqlanadi, List<Int> esa emas).

Qolgan hamma joyda - listOf va mutableListOf.

Kolleksiyalarni aylantirish #

KOTLIN
fun main() {
    val royxat = listOf(3, 1, 2, 3)

    println(royxat.toSet())
    println(royxat.toMutableList())
    println(royxat.toIntArray().joinToString(","))

    val juftliklar = listOf("a" to 1, "b" to 2)
    println(juftliklar.toMap())

    val lugat = mapOf("x" to 10, "y" to 20)
    println(lugat.toList())
}
Natija
[3, 1, 2]
[3, 1, 2, 3]
3,1,2,3
{a=1, b=2}
[(x, 10), (y, 20)]

Diqqat: toSet() natijasi [3, 1, 2] - saralanmagan. U faqat takrorlarni tashlaydi va qolganini uchrash tartibida qoldiradi. Saralangan natija kerak bo'lsa, sorted() ni alohida chaqiring.

Bo'sh kolleksiyalar #

KOTLIN
fun main() {
    val bosh = emptyList<String>()
    val boshMap = emptyMap<String, Int>()

    println(bosh)
    println(bosh.isEmpty())
    println(boshMap.size)

    val yoq: List<String>? = null
    println(yoq.orEmpty())
    println(yoq?.size ?: 0)

    for (x in bosh) {
        println("bu chiqmaydi")
    }
    println("sikl xato bermadi")
}
Natija
[]
true
0
[]
0
sikl xato bermadi

Bo'sh ro'yxat bo'ylab yurish mutlaqo xavfsiz - shuning uchun funksiyadan null emas, emptyList() qaytargan ma'qul.

Amaliy topshiriq
  1. Beshta shahar nomini listOf ga soling va chiqaring.
  2. listOf ga add qilishga urinib, xatoni o'qing.
  3. mutableListOf bilan element qo'shing va o'chiring.
  4. val ro'yxatning ichi o'zgarishini ko'rsating.
  5. Takrorlangan sonlardan toSet() bilan noyoblarini oling.
  6. Ikkita to'plamning kesishmasini toping.
  7. Mahsulot-narx juftliklaridan mapOf yasang.
  8. Mavjud bo'lmagan kalitni so'rab, natijani ko'ring.
  9. getOrPut bilan qiymat qo'shing.
  10. List parametrli funksiyaga MutableList uzating.

Xulosa #

  • listOf / setOf / mapOf - o'zgarmas; mutableListOf va hokazo - o'zgaruvchan.
  • val havolani qotiradi, kolleksiyaning ichini emas.
  • Set takrorlarni tashlaydi; distinct() tartibni saqlaydi.
  • mapOf da mavjud bo'lmagan kalit null qaytaradi, xato emas.
  • kalit to qiymat - juftlik yaratishning infiks shakli.
  • getOrPut - keshlash uchun qulay.
  • Funksiya parametrida List yozing - u ikkalasini ham qabul qiladi.
  • Massiv kamdan-kam kerak; deyarli har doim List yaxshiroq.
  • null o'rniga emptyList() qaytaring.

Keyingi bo'limda kolleksiyalar ustidagi amallarni ko'ramiz.

Xatolik topdingizmi?

Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.