BAB 5: Collection

BAB 5: Collection

5.1 List

List adalah collection yang menyimpan data secara berurutan dan dapat diakses menggunakan index.

Membuat List

// 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

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

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

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

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

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

  1. Tambahkan fitur untuk mengedit todo yang sudah ada

  2. Implementasikan fitur untuk menyimpan todo ke file

  3. Tambahkan fitur untuk mengurutkan todo berdasarkan tanggal atau status

  4. Buat fitur untuk menampilkan statistik (jumlah todo selesai/belum)

Tips Penggunaan Collection

  1. Pilih tipe collection yang sesuai:

    • List: untuk data berurutan

    • Set: untuk data unik

    • Map: untuk data key-value

  2. Gunakan tipe data spesifik untuk performa lebih baik

  3. Manfaatkan method bawaan untuk manipulasi data

  4. Pertimbangkan penggunaan late initialization jika diperlukan

  5. Selalu validasi index sebelum mengakses element

  6. Gunakan const untuk collection yang nilainya tetap

  7. Manfaatkan spread operator (...) untuk menggabungkan collection

Last updated