Masukkan Password
44 The Complete Kotlin Course #43 - Indexing and Slicing - Kotlin Tutorials for Beginners
Bagian ini melanjutkan materi sebelumnya tentang Array dan List, khususnya tentang cara mengambil elemen berdasarkan index dan cara mengambil beberapa elemen sekaligus dengan slice().
1. Mengakses elemen dengan indexing
Cara paling mudah dan paling umum untuk mengambil elemen dari Array atau List adalah menggunakan indexing syntax.
Bentuknya:
namaList[index]
Contoh:
val numbers = mutableListOf("one", "two", "three")
Isi list tersebut:
["one", "two", "three"]
Index-nya:
index
β
["one", "two", "three"]
0 1 2
Jadi:
numbers[0]
artinya:
Ambil elemen yang berada pada index
0.
Hasilnya:
one
2. Kenapa index dimulai dari 0?
Ini konsep yang sangat penting dalam programming.
Kotlin menggunakan zero-based indexing, artinya perhitungan index dimulai dari 0.
Misalnya kita punya:
val numbers = mutableListOf("one", "two", "three", "four")
Maka:
Elemen Index
------------------
"one" 0
"two" 1
"three" 2
"four" 3
Perhatikan:
Elemen pertama β index
0Elemen kedua β index1Elemen ketiga β index2Elemen keempat β index3
Jadi kalau ingin mengambil "three":
println(numbers[2])
Output:
three
Jangan berpikir seperti ini:
“three adalah elemen nomor 3, jadi index-nya 3.”
β Salah.
Dalam Kotlin:
Nomor urutan manusia β index programmer
| Urutan elemen | Index |
|---|---|
| Pertama | 0 |
| Kedua | 1 |
| Ketiga | 2 |
| Keempat | 3 |
Rumus sederhananya:
index = posisi - 1
3. Contoh indexing secara langsung
Misalnya:
val players = mutableListOf("Budi", "Andi", "Citra", "Doni")
Visualisasinya:
players
β
["Budi", "Andi", "Citra", "Doni"]
0 1 2 3
Kalau kita tulis:
println(players[0])
hasil:
Budi
Kalau:
println(players[1])
hasil:
Andi
Kalau:
println(players[2])
hasil:
Citra
Kalau:
println(players[3])
hasil:
Doni
4. Indexing berlaku untuk Array dan List
Konsep ini tidak hanya berlaku untuk List.
Array juga menggunakan indexing.
List
val names = listOf("Budi", "Andi", "Citra")
println(names[1])
Output:
Andi
Array
val names = arrayOf("Budi", "Andi", "Citra")
println(names[1])
Output:
Andi
Jadi baik:
Array
maupun:
List
sama-sama bisa menggunakan:
[index]
untuk mengambil elemen.
5. [] sebenarnya memanggil get()
Ini bagian yang agak menarik.
Ketika kita menulis:
players[1]
Kotlin sebenarnya menyediakan mekanisme yang ekuivalen dengan:
players.get(1)
Jadi:
players[1]
dan:
players.get(1)
secara konsep mengambil elemen yang sama.
Misalnya:
val players = mutableListOf("Budi", "Andi", "Citra")
Dengan indexing:
println(players[1])
hasil:
Andi
Dengan get():
println(players.get(1))
hasilnya juga:
Andi
6. Mana yang sebaiknya digunakan?
Biasanya kita lebih sering menggunakan:
players[1]
daripada:
players.get(1)
Karena lebih singkat dan mudah dibaca.
Contoh:
println(players[0])
terlihat lebih sederhana dibanding:
println(players.get(0))
Tapi penting untuk mengetahui bahwa get() memang ada.
Jadi ingat:
players[index]
β
indexing
β
players.get(index)
7. first() dan last() vs indexing
Di materi sebelumnya kita sudah belajar:
players.first()
dan:
players.last()
Sekarang kita punya:
players[0]
dan:
players[players.size - 1]
Secara konsep:
players.first()
setara dengan mengambil:
players[0]
Sedangkan:
players.last()
setara dengan:
players[players.size - 1]
Misalnya:
val players = listOf("Budi", "Andi", "Citra", "Doni")
Maka:
players.first()
β "Budi"
dan:
players[0]
β "Budi"
Untuk elemen terakhir:
players.last()
β "Doni"
Sedangkan:
players[players.size - 1]
β "Doni"
Untuk kasus sederhana, first() dan last() biasanya lebih mudah dibaca.
8. Hati-hati dengan index yang tidak ada
Misalnya:
val players = listOf("Budi", "Andi", "Citra")
Index yang valid hanya:
0 1 2
Kalau kita menulis:
println(players[3])
akan terjadi error karena index 3 tidak ada.
Begitu juga:
println(players[-1])
tidak valid.
Jadi sebelum menggunakan index, pastikan index tersebut berada dalam range yang tersedia.
9. Sekarang masuk ke slice()
Setelah belajar mengambil satu elemen, materi selanjutnya membahas cara mengambil beberapa elemen sekaligus.
Untuk itu Kotlin menyediakan:
slice()
Misalnya kita punya:
val numbers = mutableListOf("one", "two", "three", "four")
Strukturnya:
Element one two three four
Index 0 1 2 3
Kalau kita ingin mengambil beberapa elemen sekaligus, kita bisa menggunakan slice().
10. Apa itu slice()?
Secara sederhana:
slice()digunakan untuk mengambil beberapa elemen berdasarkan kumpulan index tertentu.
Bentuk sederhananya:
list.slice(range)
Contoh:
val numbers = mutableListOf("one", "two", "three", "four")
val sliced = numbers.slice(1..3)
println(sliced)
Output:
[two, three, four]
Kenapa?
Karena range:
1..3
berarti:
1
2
3
Kemudian Kotlin mengambil elemen pada index tersebut:
Index Element
0 one
1 two β
2 three β
3 four β
Hasilnya:
[two, three, four]
11. Perhatikan 1..3
Ini penting karena sebelumnya kita sudah belajar range.
Ketika kita menulis:
1..3
artinya:
1, 2, 3
Jadi angka 3 ikut termasuk.
Dengan kata lain:
numbers.slice(1..3)
berarti:
Ambil elemen dari index
1sampai index3, termasuk keduanya.
Hasil:
[two, three, four]
12. slice() tidak mengubah List asli
Misalnya:
val numbers = mutableListOf("one", "two", "three", "four")
val sliced = numbers.slice(1..3)
List asli tetap:
[one, two, three, four]
Sedangkan hasil slice disimpan di:
sliced
yang berisi:
[two, three, four]
Jadi:
numbers
β
βββ one
βββ two
βββ three
βββ four
β
β slice(1..3)
β
sliced
βββ two
βββ three
βββ four
13. Kenapa hasilnya disimpan di val sliced?
Contohnya:
val sliced = numbers.slice(1..3)
Ada dua bagian penting:
Sebelah kanan
numbers.slice(1..3)
Ini melakukan proses:
Ambil elemen index 1 sampai 3.
Sebelah kiri
val sliced
Ini menyimpan hasilnya ke sebuah variabel bernama sliced.
Jadi:
val sliced = numbers.slice(1..3)
bisa dibaca:
“Buat variabel
sliced, lalu isi dengan hasil potongan darinumbersindex 1 sampai 3.”
14. slice() bisa mengambil range yang berbeda
Misalnya:
val numbers = listOf("A", "B", "C", "D", "E")
Index:
Element A B C D E
Index 0 1 2 3 4
Ambil index 1 sampai 3
numbers.slice(1..3)
hasil:
[B, C, D]
Ambil index 0 sampai 2
numbers.slice(0..2)
hasil:
[A, B, C]
Ambil index 2 sampai 4
numbers.slice(2..4)
hasil:
[C, D, E]
15. Bedakan indexing dan slicing
Ini konsep yang sangat penting.
Indexing
Mengambil satu elemen:
numbers[2]
Hasil:
C
Slicing
Mengambil beberapa elemen:
numbers.slice(1..3)
Hasil:
[B, C, D]
Gambaran:
List:
[A, B, C, D, E]
0 1 2 3 4
INDEXING
β
numbers[2]
β
C
SLICING
β
numbers.slice(1..3)
β
[B, C, D]
Jadi:
Indexing = ambil satu. Slicing = ambil beberapa.
16. slice() menerima index, bukan langsung angka elemen
Misalnya:
val numbers = listOf("one", "two", "three", "four")
Kalau:
numbers.slice(1..3)
yang digunakan adalah:
index 1
index 2
index 3
bukan:
elemen "one" sampai "three"
Ini penting karena slice() bekerja berdasarkan posisi/index.
17. Apa maksud “returns an Iterable”?
Caption menyebut bahwa slice() mengembalikan sesuatu yang disebut Iterable.
Untuk tahap sekarang, tidak perlu terlalu pusing dengan istilah tersebut.
Secara sederhana, pahami dulu bahwa:
val sliced = numbers.slice(1..3)
menghasilkan sebuah kumpulan elemen baru yang bisa kita gunakan lagi.
Contohnya:
println(sliced)
bisa menghasilkan:
[two, three, four]
Nanti ketika masuk materi looping dan Iterable, konsep ini akan menjadi lebih jelas.
18. Contoh lengkap
Misalnya kita membuat program:
fun main() {
val players = mutableListOf(
"Budi",
"Andi",
"Citra",
"Doni"
)
println(players[0])
println(players[2])
val selectedPlayers = players.slice(1..3)
println(selectedPlayers)
}
Output:
Budi
Citra
[Andi, Citra, Doni]
Mari kita pecah.
players[0]
Budi
Mengambil satu elemen.
players[2]
Citra
Mengambil satu elemen.
players.slice(1..3)
Mengambil:
index 1 β Andi
index 2 β Citra
index 3 β Doni
Sehingga:
[Andi, Citra, Doni]
19. Kesalahan yang sering dilakukan pemula
Misalnya:
val players = listOf("Budi", "Andi", "Citra")
Ada 3 elemen.
Pemula kadang berpikir:
players[3]
untuk mendapatkan "Citra".
β Salah.
Karena:
Budi β 0
Andi β 1
Citra β 2
Maka yang benar:
players[2]
20. Kesalahan lain: mengira slice(1..3) hanya mengambil 1 dan 3
Misalnya:
players.slice(1..3)
Range:
1..3
bukan berarti:
1 dan 3
tetapi:
1, 2, 3
Jadi semuanya diambil:
index 1
index 2
index 3
21. Ringkasan semua cara akses yang sudah dipelajari
Sekarang kita sudah punya beberapa cara:
| Syntax | Kegunaan |
|---|---|
list.first() | Mengambil elemen pertama |
list.last() | Mengambil elemen terakhir |
list[index] | Mengambil satu elemen berdasarkan index |
list.get(index) | Cara lain mengambil satu elemen |
list.slice(range) | Mengambil beberapa elemen |
Contoh:
val names = listOf("Budi", "Andi", "Citra", "Doni")
Pertama
names.first()
β Budi
Terakhir
names.last()
β Doni
Berdasarkan index
names[1]
β Andi
Dengan get()
names.get(1)
β Andi
Beberapa sekaligus
names.slice(1..3)
β [Andi, Citra, Doni]
π§ Cara paling gampang mengingat
Bayangkan List seperti deretan loker:
INDEX
β
ββββββ¬βββββ¬ββββββββ¬βββββββ
βBudiβAndiβ Citra β Doni β
ββββββ΄βββββ΄ββββββββ΄βββββββ
0 1 2 3
Kalau bertanya:
“Siapa yang ada di loker nomor 2?”
Gunakan:
players[2]
Kalau bertanya:
“Siapa orang pertama?”
Gunakan:
players.first()
Kalau:
“Siapa orang terakhir?”
Gunakan:
players.last()
Kalau:
“Ambil orang dari loker 1 sampai 3.”
Gunakan:
players.slice(1..3)
Intinya:
[0] β elemen pertama
[1] β elemen kedua
[2] β elemen ketiga
[index] β ambil satu elemen
get(index) β alternatif [index]
slice(1..3) β ambil beberapa elemen
Dan satu aturan yang wajib banget diingat:
π₯ Kotlin menggunakan zero-based indexing. Jadi elemen pertama selalu berada di index
0.
Bagian setelah ini kemungkinan akan masuk ke cara mengecek apakah suatu elemen terdapat di dalam List/Array, misalnya menggunakan contains(), in, dan pengecekan berdasarkan kondisi.