Masukkan Password
44 Exercise Solution Chapter 4 | Chapter Collections Exercise Solution | Learn Dart | Dart Course
Kali ini caption menjelaskan solusi lengkap dari 7 soal latihan Chapter 4 Dart secara praktik. Saya akan jelaskan bukan hanya βkode akhirnyaβ, tetapi juga kenapa kode itu digunakan dan bagaimana cara berpikirnya.
Ada beberapa kesalahan transkripsi pada caption seperti βDOTβ, βdo IOβ, dan sebagainya. Yang dimaksud adalah Dart dan dart:io.
π Practice Exercise Chapter 4 β Pembahasan Lengkap
Ada 7 soal:
- Membuat List nama dan mencetak semua nama
- Membuat Set buah dan mencetak semua buah dengan loop
- Memasukkan pengeluaran dari user dan menghitung total
- Membuat List kosong
daysdan mengisinya denganadd() - Mencari nama teman yang dimulai dengan huruf A menggunakan
where() - Membuat Map dan meng-update value
country - Mencari key Map yang memiliki panjang 4 karakter menggunakan
where()
Materi ini bagus karena menggabungkan semua yang sudah kita pelajari:
List
Set
Map
add()
for
forEach()
where()
keys
String
Input user
1. Membuat List nama dan print semua nama
Soalnya:
Create a list of names and print all names using List.
Artinya kita diminta membuat sebuah List berisi nama-nama, kemudian menampilkannya.
Kodenya
void main() {
List<String> names = [
"Budi",
"Andi",
"Siti",
"Joko",
];
print(names);
}
Output:
[Budi, Andi, Siti, Joko]
Ini sudah benar untuk mencetak seluruh List sekaligus.
Kalau ingin print satu per satu
Kita bisa menggunakan for-in:
void main() {
List<String> names = [
"Budi",
"Andi",
"Siti",
"Joko",
];
for (String name in names) {
print(name);
}
}
Output:
Budi
Andi
Siti
Joko
Cara kerja loop
Misalnya:
for (String name in names) {
print(name);
}
Dart mengambil isi List satu per satu:
names
β
Budi β print
Andi β print
Siti β print
Joko β print
π§ Yang dipelajari
List<String>
berarti List yang berisi String.
Sedangkan:
for (String name in names)
digunakan untuk mengambil setiap elemen dalam List.
2. Membuat Set buah dan print menggunakan Loop
Soalnya:
Create a Set of fruits and print all fruits using Loop.
Karena yang diminta adalah Set, kita menggunakan {}.
void main() {
Set<String> fruits = {
"Mango",
"Apple",
"Banana",
};
for (String fruit in fruits) {
print(fruit);
}
}
Output:
Mango
Apple
Banana
Kenapa Set<String>?
Karena kita ingin menyimpan kumpulan buah yang unik.
Misalnya:
Set<String> fruits = {
"Mango",
"Apple",
"Mango",
};
Mango hanya akan dianggap satu elemen.
Berbeda dengan List:
List<String> fruits = [
"Mango",
"Apple",
"Mango",
];
List masih bisa mempunyai:
Mango
Apple
Mango
Jadi:
List β boleh duplikat
Set β elemen unik
3. Input pengeluaran dan menghitung total
Nah, ini adalah soal yang lebih panjang.
Soalnya:
Create a program that reads a list of expenses amount using user input and print total.
Maksudnya:
- Buat List kosong untuk menyimpan pengeluaran.
- Minta user memasukkan pengeluaran.
- Simpan setiap pengeluaran ke List.
- Setelah semua input selesai, hitung total.
- Print totalnya.
Langkah pertama: buat List kosong
List<num> expenses = [];
Awalnya:
expenses = []
Belum ada data.
Kemudian setiap kali user memasukkan pengeluaran, kita masukkan menggunakan:
expenses.add(expense);
Misalnya user memasukkan:
10000
33000
5000
Maka List menjadi:
[10000, 33000, 5000]
Langkah kedua: import dart:io
Karena kita ingin menerima input dari keyboard, kita membutuhkan:
import 'dart:io';
Jadi:
import 'dart:io';
digunakan untuk berbagai operasi input/output, termasuk:
stdin
stdout
File
Langkah ketiga: mengambil input user
Kita bisa menggunakan:
stdin.readLineSync()
Contoh:
String? input = stdin.readLineSync();
Kalau user mengetik:
10000
maka input berisi:
"10000"
Perhatikan bahwa hasil input tersebut adalah String, bukan angka.
Kenapa harus dikonversi?
Karena kita ingin melakukan:
10000 + 33000 + 5000
Maka kita membutuhkan angka.
Kita bisa menggunakan:
num.parse(input!)
Misalnya:
num expense = num.parse(input!);
Alurnya:
User mengetik
"10000"
β
String
β
num.parse()
β
10000
β
expense
Apa arti tanda !?
Pada:
input!
tanda ! disebut null assertion operator.
Untuk sekarang, pahami sederhananya:
String? input
berarti:
inputmungkin berisi String, tetapi mungkin juganull.
Sedangkan:
input!
berarti:
“Saya yakin
inputtidak null.”
Ini memang berhubungan dengan null safety, yang biasanya dibahas lebih lanjut di chapter khusus.
Langkah keempat: memasukkan expense ke List
Setelah kita mendapatkan:
num expense = num.parse(input!);
kita masukkan:
expenses.add(expense);
Misalnya:
Input 1 β 10000
Input 2 β 33000
Input 3 β 5000
Maka:
expenses
β
[10000, 33000, 5000]
Mengapa menggunakan for?
Pada video, instructor ingin memasukkan 5 expense.
Maka loop bisa dibuat:
for (int i = 1; i <= 5; i++) {
...
}
Loop berjalan:
i = 1
i = 2
i = 3
i = 4
i = 5
Jadi total 5 kali.
Program lengkap untuk soal nomor 3
Versi yang mudah dipahami:
import 'dart:io';
void main() {
List<num> expenses = [];
for (int i = 1; i <= 5; i++) {
print("Enter expense $i:");
String? input = stdin.readLineSync();
num expense = num.parse(input!);
expenses.add(expense);
}
num total = 0;
expenses.forEach((expense) {
total += expense;
});
print("Total: $total");
}
Misalnya input:
Enter expense 1:
10000
Enter expense 2:
33000
Enter expense 3:
5000
Enter expense 4:
20000
Enter expense 5:
1000
Maka:
Total: 69000
Bagaimana total += expense bekerja?
Ini bagian yang sangat penting.
Kita punya:
num total = 0;
Awalnya:
total = 0
Kemudian:
total += expense;
sebenarnya sama dengan:
total = total + expense;
Misalnya:
expenses = [10000, 33000, 5000]
Prosesnya:
Awal:
total = 0
expense = 10000
total = 0 + 10000
total = 10000
expense = 33000
total = 10000 + 33000
total = 43000
expense = 5000
total = 43000 + 5000
total = 48000
Akhirnya:
total = 48000
4. List kosong days dan menggunakan add()
Soalnya:
Create an empty List of type String called
days. Use theaddmethod to add names of seven days and print all days.
Kita diminta membuat:
List<String> days = [];
Artinya:
days = []
List masih kosong.
Kemudian tambahkan hari satu per satu:
days.add("Sunday");
days.add("Monday");
days.add("Tuesday");
days.add("Wednesday");
days.add("Thursday");
days.add("Friday");
days.add("Saturday");
Program lengkap
void main() {
List<String> days = [];
days.add("Sunday");
days.add("Monday");
days.add("Tuesday");
days.add("Wednesday");
days.add("Thursday");
days.add("Friday");
days.add("Saturday");
print(days);
}
Output:
[Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday]
Apa fungsi add()?
Misalnya:
List<String> days = [];
Kemudian:
days.add("Sunday");
menjadi:
[Sunday]
Kemudian:
days.add("Monday");
menjadi:
[Sunday, Monday]
Kemudian:
days.add("Tuesday");
menjadi:
[Sunday, Monday, Tuesday]
Jadi:
add()
berarti:
Tambahkan satu item ke bagian akhir List.
Print satu per satu dengan forEach()
Kita juga bisa:
days.forEach((day) {
print(day);
});
Hasil:
Sunday
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
5. Mencari nama yang dimulai huruf A menggunakan where()
Ini merupakan latihan penting karena menguji where().
Soalnya:
Add seven friend names to the List. Use
where()to find a name that starts with alphabet A.
Misalnya:
List<String> friends = [
"Ali",
"Budi",
"Andi",
"Siti",
"Agus",
"Joko",
"Rina",
];
Kita ingin mencari:
Ali
Andi
Agus
karena semuanya dimulai dengan A.
Menggunakan where()
var result = friends
.where((e) => e.startsWith("A"))
.toList();
Kemudian:
print(result);
Output:
[Ali, Andi, Agus]
Bedah kode
Bagian:
friends.where(...)
artinya:
Filter isi
friends.
Kemudian:
(e) => e.startsWith("A")
adalah kondisi filter.
Artinya:
Ambil elemen yang diawali huruf A.
Bagaimana prosesnya?
Misalnya:
friends
berisi:
Ali
Budi
Andi
Siti
Agus
Joko
Rina
where() memeriksa satu per satu:
Ali β startsWith("A") β true β
Budi β startsWith("A") β false β
Andi β startsWith("A") β true β
Siti β startsWith("A") β false β
Agus β startsWith("A") β true β
Joko β startsWith("A") β false β
Rina β startsWith("A") β false β
Hasil:
Ali
Andi
Agus
Kenapa menggunakan "A" bukan "a"?
Karena String di Dart case-sensitive.
Artinya:
"A" β "a"
Contoh:
"Ali".startsWith("A") // true
Tetapi:
"Ali".startsWith("a") // false
Jadi kalau nama-namanya menggunakan huruf kapital:
Ali
Andi
Agus
kita perlu:
startsWith("A")
Apa fungsi .toList()?
where() menghasilkan Iterable.
Kalau ingin menyimpannya sebagai List:
.toList()
Jadi:
friends.where(...).toList();
artinya:
List friends
β
where()
β
filter
β
Iterable
β
toList()
β
List result
6. Membuat Map dan meng-update country
Soalnya:
Create a Map with name, address, age and country keys. Store values. Update country name to another country and print all keys and values.
Ini latihan untuk Map.
Kita memiliki:
key β value
name β Budi
address β ABC
age β 20
country β Indonesia
Membuat Map
Karena value-nya memiliki tipe berbeda:
name β String
address β String
age β int
country β String
kita menggunakan:
Map<String, dynamic>
Contoh:
void main() {
Map<String, dynamic> myMap = {
"name": "Budi",
"address": "ABC",
"age": 20,
"country": "Indonesia",
};
print(myMap);
}
Kenapa bukan Map<String, String>?
Kalau kita menulis:
Map<String, String>
maka semua value harus String.
Misalnya:
Map<String, String> myMap = {
"name": "Budi",
"address": "ABC",
"age": 20,
};
akan bermasalah karena:
20 β int
bukan String.
Kalau ingin menggunakan Map<String, String>, kita harus menulis:
"age": "20"
Tetapi dalam contoh ini kita ingin age menjadi angka.
Maka:
Map<String, dynamic>
lebih cocok.
Update country
Misalnya awalnya:
country β Indonesia
Kita ingin mengubah menjadi:
country β Malaysia
Caranya:
myMap["country"] = "Malaysia";
Setelah itu:
print(myMap);
hasilnya:
{name: Budi, address: ABC, age: 20, country: Malaysia}
Mengapa kode tersebut bisa melakukan update?
Karena Map bekerja dengan konsep:
key β value
Kita menentukan key:
myMap["country"]
kemudian memberikan value baru:
= "Malaysia";
Jadi:
myMap["country"] = "Malaysia";
berarti:
Cari key
country, kemudian ubah value-nya menjadiMalaysia.
Bagaimana kalau key belum ada?
Misalnya:
myMap["city"] = "Madiun";
Kalau city belum ada, Dart akan menambah entry baru.
Jadi syntax:
map[key] = value;
bisa digunakan untuk:
Tambah data baru
ATAU
Update data lama
tergantung apakah key tersebut sudah ada atau belum.
Print key dan value satu per satu
Kalau ingin menampilkan:
name: Budi
address: ABC
age: 20
country: Malaysia
kita bisa menggunakan:
myMap.forEach((key, value) {
print("$key: $value");
});
Ini lebih jelas daripada:
print(myMap);
7. Map + where() untuk mencari key dengan panjang 4
Ini soal terakhir.
Soalnya:
Create a Map with name and phone keys and store some values. Use
where()to find all keys that have length four.
Misalnya kita punya:
Map<String, dynamic> myMap = {
"name": "Budi",
"phone": "08123456789",
};
Kita ingin memeriksa key, bukan value.
Key-nya:
name
phone
Panjang:
name β 4
phone β 5
Maka hasilnya:
name
Mengambil semua key
Karena kita ingin mencari key, gunakan:
myMap.keys
Ini menghasilkan semua key:
name
phone
Kemudian kita bisa menggunakan where():
var result = myMap.keys
.where((e) => e.length == 4)
.toList();
Lalu:
print(result);
Output:
[name]
Bedah kode
myMap.keys
Artinya:
Ambil semua key dari Map.
Kemudian:
.where(...)
artinya:
Filter key tersebut.
Kemudian:
e.length == 4
artinya:
Hanya ambil key yang panjangnya tepat 4 karakter.
Prosesnya
Misalnya:
myMap.keys
name
phone
where() memeriksa:
name
β
length = 4
β
4 == 4
β
true β
Kemudian:
phone
β
length = 5
β
5 == 4
β
false β
Maka hasil:
[name]
Bagaimana kalau menggunakan >= 4?
Misalnya kita ubah:
e.length == 4
menjadi:
e.length >= 4
Sekarang artinya:
Ambil semua key yang panjangnya minimal 4 karakter.
Maka:
name β 4 β true β
phone β 5 β true β
hasil:
[name, phone]
β οΈ Perbedaan == dan >=
Ini penting.
==
e.length == 4
artinya:
Harus tepat 4.
Contoh:
abc β 3 β
abcd β 4 β
abcde β 5 β
>=
e.length >= 4
artinya:
4 atau lebih.
Contoh:
abc β 3 β
abcd β 4 β
abcde β 5 β
abcdef β 6 β
π§ Sekarang kita lihat hubungan semua soal
Sebenarnya 7 soal ini mengajarkan pola yang sangat penting.
Soal 1 β List
List<String> names = [
"Budi",
"Andi",
];
Kita belajar:
List
Soal 2 β Set
Set<String> fruits = {
"Apple",
"Mango",
};
Kita belajar:
Set
Soal 3 β User Input + List
String? input = stdin.readLineSync();
Kemudian:
expenses.add(expense);
Kita belajar:
Input
List
add()
Loop
Perhitungan
Soal 4 β add()
days.add("Sunday");
Kita belajar bagaimana menambahkan data ke List kosong.
Soal 5 β where()
friends
.where((e) => e.startsWith("A"))
.toList();
Kita belajar:
Filter List
Soal 6 β Map
myMap["country"] = "Malaysia";
Kita belajar:
Map
Key
Value
Update
Soal 7 β Map + where()
myMap.keys
.where((e) => e.length == 4)
.toList();
Kita belajar:
Map
keys
where()
length
condition
π₯ Pola penting yang harus kamu hafalkan
Bukan hafal seluruh programnya, tetapi hafalkan pola berpikirnya.
Kalau ingin membuat List:
List<String> names = [];
Kalau ingin menambahkan data:
names.add("Budi");
Kalau ingin melakukan sesuatu ke semua item:
for (var item in names) {
print(item);
}
atau:
names.forEach((item) {
print(item);
});
Kalau ingin mencari/filter data:
names.where((item) => condition);
Kalau ingin filter Map berdasarkan key:
myMap.keys.where((key) => condition);
Kalau ingin update value Map:
myMap["key"] = newValue;
π― Perbedaan for, forEach, dan where
Karena ketiganya muncul dalam latihan ini, kamu harus bisa membedakannya.
| Method | Tujuan |
|---|---|
for | Mengulang data |
forEach() | Mengulang setiap item |
where() | Memfilter/mencari item sesuai kondisi |
Contoh:
for
for (var item in fruits) {
print(item);
}
Artinya:
Print semua item.
forEach
fruits.forEach((item) {
print(item);
});
Artinya:
Lakukan sesuatu untuk setiap item.
where
fruits.where((item) => item.length > 5);
Artinya:
Cari hanya item yang panjangnya lebih dari 5.
π§© Gambaran besar Chapter 4
Kamu bisa membayangkan seperti ini:
COLLECTION
β
ββββββββββββΌβββββββββββ
β β β
LIST SET MAP
β β β
β β βββ key
β β βββ value
β β
ββββββ¬ββββββ
β
LOOP
β
ββββββ΄βββββ
β β
for/ forEach()
β
β
where()
β
β
FILTER
Dan latihan ini sebenarnya sedang melatih kamu untuk berpikir:
βData saya bentuknya apa, lalu saya ingin melakukan apa terhadap data tersebut?β
Contohnya:
Saya punya banyak nama
β
List
Saya ingin semua nama
β
for / forEach
Saya ingin nama yang diawali A
β
where()
Saya punya key β value
β
Map
Saya ingin mencari key
β
map.keys
Saya ingin key tertentu saja
β
map.keys.where(...)
β Kesimpulan terpenting
Kalau kamu sudah memahami latihan ini, berarti konsep dasar Collection Dart sudah mulai tersambung.
Yang paling wajib kamu kuasai:
List<String> names = [];
Set<String> fruits = {};
Map<String, dynamic> data = {};
list.add(value);
for (var item in list) {
print(item);
}
list.forEach((item) {
print(item);
});
list.where((item) => condition).toList();
map.keys.where((key) => condition).toList();
map["key"] = newValue;
Dan satu hal yang sangat penting: where() tidak mengubah data asli. Ia digunakan untuk menghasilkan kumpulan hasil yang sudah difilter. Sebaliknya, method seperti removeWhere() dan retainWhere() memang mengubah collection aslinya.