BAB 5: Collection
5.1 List
List adalah collection yang menyimpan data secara berurutan dan dapat diakses menggunakan index.
Membuat List
Copy // List dengan tipe data spesifik
List < int > numbers = [ 1 , 2 , 3 , 4 , 5 ];
List < String > names = [ 'Budi' , 'Ani' , 'Citra' ];
// List dynamic
var mixed = [ 1 , 'dua' , true , 3.14 ];
// List kosong
List < String > emptyList = [];
var anotherEmptyList = < int > [];
// List dengan ukuran tetap
List < int > fixedList = List . filled ( 5 , 0 ); // [0, 0, 0, 0, 0]
Mengakses dan Memodifikasi List
Copy void main () {
List < String > fruits = [ 'Apel' , 'Jeruk' , 'Mangga' , 'Pisang' ];
// Mengakses element
print (fruits[ 0 ]); // Apel
print (fruits.first); // Apel
print (fruits.last); // Pisang
// Mengubah element
fruits[ 1 ] = 'Anggur' ;
print (fruits); // [Apel, Anggur, Mangga, Pisang]
// Menambah element
fruits. add ( 'Durian' ); // Menambah di akhir
fruits. insert ( 2 , 'Rambutan' ); // Menambah di index tertentu
// Menghapus element
fruits. remove ( 'Mangga' ); // Menghapus nilai tertentu
fruits. removeAt ( 0 ); // Menghapus berdasarkan index
fruits. removeLast (); // Menghapus element terakhir
// Mengecek isi list
print (fruits.length); // Panjang list
print (fruits.isEmpty); // Cek apakah kosong
print (fruits. contains ( 'Apel' )); // Cek keberadaan element
}
Method Berguna untuk List
Copy void main () {
List < int > numbers = [ 1 , 3 , 5 , 2 , 4 ];
// Sorting
numbers. sort ();
print (numbers); // [1, 2, 3, 4, 5]
// Membalik urutan
var reversed = numbers.reversed. toList ();
print (reversed); // [5, 4, 3, 2, 1]
// Mapping
var doubled = numbers. map ((n) => n * 2 ). toList ();
print (doubled); // [2, 4, 6, 8, 10]
// Filtering
var evenNumbers = numbers. where ((n) => n % 2 == 0 ). toList ();
print (evenNumbers); // [2, 4]
// forEach
numbers. forEach ((n) => print ( 'Angka: $n ' ));
}
5.2 Set
Set adalah collection yang menyimpan nilai unik tanpa urutan tertentu.
Membuat dan Menggunakan Set
Copy void main () {
// Membuat Set
Set < int > numbers = { 1 , 2 , 3 , 4 , 5 };
var fruits = < String > { 'Apel' , 'Jeruk' , 'Mangga' };
// Menambah element
numbers. add ( 6 );
numbers. addAll ([ 7 , 8 , 9 ]);
// Set menghilangkan duplikat secara otomatis
fruits. add ( 'Apel' );
print (fruits); // {Apel, Jeruk, Mangga}
// Operasi Set
var set1 = { 1 , 2 , 3 , 4 };
var set2 = { 3 , 4 , 5 , 6 };
print (set1. union (set2)); // {1, 2, 3, 4, 5, 6}
print (set1. intersection (set2)); // {3, 4}
print (set1. difference (set2)); // {1, 2}
// Mengecek element
print (set1. contains ( 2 )); // true
print (set1. containsAll ([ 1 , 2 ])); // true
}
5.3 Map
Map adalah collection yang menyimpan data dalam bentuk pasangan key-value.
Membuat dan Menggunakan Map
Copy void main () {
// Membuat Map
Map < String , String > person = {
'name' : 'Budi' ,
'age' : '25' ,
'city' : 'Jakarta'
};
var student = < String , dynamic > {
'name' : 'Ani' ,
'age' : 20 ,
'isActive' : true ,
'scores' : [ 85 , 90 , 95 ]
};
// Mengakses value
print (person[ 'name' ]); // Budi
print (student[ 'scores' ][ 0 ]); // 85
// Mengubah value
person[ 'city' ] = 'Bandung' ;
// Menambah entry baru
person[ 'job' ] = 'Programmer' ;
// Menghapus entry
person. remove ( 'age' );
// Method berguna untuk Map
print (person.keys); // Semua key
print (person.values); // Semua value
print (person.entries); // Semua pasangan key-value
print (person. containsKey ( 'name' )); // true
// Iterasi Map
person. forEach ((key, value) {
print ( ' $key : $value ' );
});
}
5.4 Praktek: Program To-Do List
Copy import 'dart:io' ;
class TodoItem {
String title;
bool isDone;
DateTime createdAt;
TodoItem (this.title)
: isDone = false ,
createdAt = DateTime . now ();
}
class TodoList {
List < TodoItem > _items = [];
// Menambah todo
void addTodo ( String title) {
_items. add ( TodoItem (title));
print ( '\n✓ Todo berhasil ditambahkan!' );
}
// Menampilkan semua todo
void showTodos () {
if (_items.isEmpty) {
print ( '\nTodo list kosong!' );
return ;
}
print ( '\n=== DAFTAR TODO ===' );
for ( var i = 0 ; i < _items.length; i ++ ) {
var item = _items[i];
var status = item.isDone ? '[✓]' : '[ ]' ;
print ( ' ${i + 1 } . $status ${item.title} ' );
print ( ' Dibuat: ${ _formatDate (item.createdAt)} ' );
}
}
// Menandai todo sebagai selesai
void markAsDone ( int index) {
if ( _isValidIndex (index)) {
_items[index].isDone = true ;
print ( '\n✓ Todo berhasil ditandai selesai!' );
} else {
print ( '\nIndex tidak valid!' );
}
}
// Menghapus todo
void removeTodo ( int index) {
if ( _isValidIndex (index)) {
_items. removeAt (index);
print ( '\n✓ Todo berhasil dihapus!' );
} else {
print ( '\nIndex tidak valid!' );
}
}
// Mencari todo
void searchTodo ( String keyword) {
var results = _items
. where ((item) =>
item.title. toLowerCase (). contains (keyword. toLowerCase ()))
. toList ();
if (results.isEmpty) {
print ( '\nTodo tidak ditemukan!' );
return ;
}
print ( '\n=== HASIL PENCARIAN ===' );
for ( var item in results) {
var status = item.isDone ? '[✓]' : '[ ]' ;
print ( ' $status ${item.title} ' );
print ( 'Dibuat: ${ _formatDate (item.createdAt)} ' );
}
}
// Helper method untuk validasi index
bool _isValidIndex ( int index) {
return index >= 0 && index < _items.length;
}
// Helper method untuk format tanggal
String _formatDate ( DateTime date) {
return ' ${date.day} / ${date.month} / ${date.year} ${date.hour} : ${date.minute} ' ;
}
}
void main () {
var todoList = TodoList ();
while ( true ) {
print ( '\n=== TODO LIST APP ===' );
print ( '1. Tambah Todo' );
print ( '2. Lihat Semua Todo' );
print ( '3. Tandai Selesai' );
print ( '4. Hapus Todo' );
print ( '5. Cari Todo' );
print ( '6. Keluar' );
stdout. write ( '\nPilih menu (1-6): ' );
String ? input = stdin. readLineSync ();
switch (input) {
case '1' :
stdout. write ( '\nMasukkan todo baru: ' );
String ? title = stdin. readLineSync ();
if (title != null && title.isNotEmpty) {
todoList. addTodo (title);
}
case '2' :
todoList. showTodos ();
case '3' :
stdout. write ( '\nMasukkan nomor todo: ' );
int index = int . tryParse (stdin. readLineSync () ?? '' ) ?? - 1 ;
todoList. markAsDone (index - 1 );
case '4' :
stdout. write ( '\nMasukkan nomor todo: ' );
int index = int . tryParse (stdin. readLineSync () ?? '' ) ?? - 1 ;
todoList. removeTodo (index - 1 );
case '5' :
stdout. write ( '\nMasukkan kata kunci: ' );
String ? keyword = stdin. readLineSync ();
if (keyword != null ) {
todoList. searchTodo (keyword);
}
case '6' :
print ( '\nTerima kasih telah menggunakan Todo List App!' );
return ;
default:
print ( '\nMenu tidak valid!' );
}
}
}
Latihan Mandiri
Tambahkan fitur untuk mengedit todo yang sudah ada
Implementasikan fitur untuk menyimpan todo ke file
Tambahkan fitur untuk mengurutkan todo berdasarkan tanggal atau status
Buat fitur untuk menampilkan statistik (jumlah todo selesai/belum)
Tips Penggunaan Collection
Pilih tipe collection yang sesuai:
List: untuk data berurutan
Map: untuk data key-value
Gunakan tipe data spesifik untuk performa lebih baik
Manfaatkan method bawaan untuk manipulasi data
Pertimbangkan penggunaan late initialization jika diperlukan
Selalu validasi index sebelum mengakses element
Gunakan const untuk collection yang nilainya tetap
Manfaatkan spread operator (...) untuk menggabungkan collection