9-bo‘lim
Kolleksiyalar
List, Set va Map, o'zgaruvchan va o'zgarmas shakllari, massivlar va nega Kotlin da ikki xil kolleksiya turi bor.
Ushbu bo‘lim mundarijasi
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 #
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"))
}
[Namangan, Andijon, Farg'ona]
3
Namangan
Namangan
Farg'ona
true
2
listOf o'zgarmas ro'yxat yaratadi - unga element qo'shib
bo'lmaydi.
val shaharlar = listOf("Namangan")
shaharlar.add("Andijon") // error: unresolved reference: add
MutableList #
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())
}
[NAMANGAN, Qo'qon, Farg'ona]
3
[Qo'qon, Farg'ona]
true
| Metod | Nima 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] = x | Almashtiradi |
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.
Diqqat qiling - yuqoridagi misolda val royxat edi, lekin elementlar
o'zgardi!
val havolani qotiradi, ro'yxatning ichini emas:
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 #
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)
}
[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 #
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)
}
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 #
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"])
}
{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 #
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")
}
}
Malika: 88
Husanboy: 92
Aziza: 95
---
Malika -> 88
Husanboy -> 92
Aziza -> 95
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 #
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))
}
6
15
Parametr List deb yozilgani uchun funksiya ikkalasini ham qabul
qildi - lekin ichida o'zgartira olmaydi.
Massivlar #
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])
}
5, 10, 15
Malika, Aziza
0, 0, 0
0, 10, 20
3
10
Kotlin da massiv kamdan-kam kerak bo'ladi. List qulayroq va
xavfsizroq.
Massiv faqat uch holatda kerak:
- Java kutubxonasi aynan massiv talab qilganda.
varargparametrlar bilan ishlaganda.- 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 #
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())
}
[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 #
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")
}
[]
true
0
[]
0
sikl xato bermadi
Bo'sh ro'yxat bo'ylab yurish mutlaqo xavfsiz - shuning uchun
funksiyadan null emas, emptyList() qaytargan ma'qul.
- Beshta shahar nomini
listOfga soling va chiqaring. listOfgaaddqilishga urinib, xatoni o'qing.mutableListOfbilan element qo'shing va o'chiring.valro'yxatning ichi o'zgarishini ko'rsating.- Takrorlangan sonlardan
toSet()bilan noyoblarini oling. - Ikkita to'plamning kesishmasini toping.
- Mahsulot-narx juftliklaridan
mapOfyasang. - Mavjud bo'lmagan kalitni so'rab, natijani ko'ring.
getOrPutbilan qiymat qo'shing.Listparametrli funksiyagaMutableListuzating.
Xulosa #
listOf/setOf/mapOf- o'zgarmas;mutableListOfva hokazo - o'zgaruvchan.valhavolani qotiradi, kolleksiyaning ichini emas.Settakrorlarni tashlaydi;distinct()tartibni saqlaydi.mapOfda mavjud bo'lmagan kalitnullqaytaradi, xato emas.kalit to qiymat- juftlik yaratishning infiks shakli.getOrPut- keshlash uchun qulay.- Funksiya parametrida
Listyozing - u ikkalasini ham qabul qiladi. - Massiv kamdan-kam kerak; deyarli har doim
Listyaxshiroq. nullo'rnigaemptyList()qaytaring.
Keyingi bo'limda kolleksiyalar ustidagi amallarni ko'ramiz.
O‘qish tarixini saqlamoqchimisiz?
Tizimga kirsangiz, tugatgan bo‘limlaringiz saqlanadi va qoldirgan joyingizdan davom etasiz.
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.