dartsethimpunanMenengah3 mnt baca

Operasi Himpunan Set

Matematika himpunan di kode: union, intersection, difference.

Teori himpunan yang hidup

Di sekolah kamu belajar diagram Venn: gabungan, irisan, selisih. Operasi himpunan di Dart menerapkan itu langsung ke Set: menggabung dua grup tanpa duplikat, mencari anggota bersama, atau mencari yang unik di satu sisi.

Analogi: dua kelas mengadakan bakti sosial. Union = semua peserta dari kedua kelas. Intersection = siswa yang ikut di kedua kegiatan. Difference = yang ikut kelas A tapi tidak ikut kelas B.

Kenapa operasi himpunan ada?

Karena pertanyaan "apa yang sama/beda di dua grup" muncul terus: sinkronisasi data, perbandingan tag, filter "sudah dibaca vs belum". Menulis loop manual untuk ini rawan salah; operasi bawaan satu baris dan teruji.

Tiga operasi utama

dart
void main() {
  var kelasA = {'Budi', 'Ani', 'Cici'};
  var kelasB = {'Ani', 'Cici', 'Dedi'};

  // UNION: gabungan, duplikat otomatis hilang
  print(kelasA.union(kelasB)); // {Budi, Ani, Cici, Dedi}

  // INTERSECTION: irisan, yang ada di KEDUANYA
  print(kelasA.intersection(kelasB)); // {Ani, Cici}

  // DIFFERENCE: yang ada di A tapi TIDAK di B
  print(kelasA.difference(kelasB)); // {Budi}
  print(kelasB.difference(kelasA)); // {Dedi}
}

Ketiganya mengembalikan Set BARU; set asli tidak berubah.

Contoh kedua, kasus nyata: sinkronisasi tag artikel:

dart
void main() {
  var tagLama = {'dart', 'flutter', 'mobile'};
  var tagBaru = {'dart', 'web', 'backend'};

  var ditambah = tagBaru.difference(tagLama);
  var dihapus = tagLama.difference(tagBaru);
  var tetap = tagLama.intersection(tagBaru);

  print('Tambah: $ditambah'); // {web, backend}
  print('Hapus: $dihapus');   // {flutter, mobile}
  print('Tetap: $tetap');     // {dart}
}

Tiga baris menjawab "apa yang berubah" secara presisi. Inilah pola diff yang dipakai sinkronisasi data.

Mengecek hubungan himpunan

dart
void main() {
  var semua = {'a', 'b', 'c'};
  var sebagian = {'a', 'b'};

  print(semua.containsAll(sebagian)); // true
  print(sebagian.containsAll(semua)); // false
}

containsAll mengecek apakah sebuah set memuat semua anggota set lain (relasi subset).

Kesalahan umum

1. Mengira operasi mengubah set asli

dart
void main() {
  var a = {'x', 'y'};
  var b = {'y', 'z'};
  a.union(b); // hasil dibuang!
  print(a); // {x, y}, tidak berubah
  var gabung = a.union(b);
  print(gabung); // {x, y, z}
}

Simpan hasilnya seperti method string: operasi himpunan tidak mutatif.

2. Difference tidak komutatif

a.difference(b) ≠ b.difference(a). Urutan penting: "yang di A tapi tidak di B" vs sebaliknya.

3. Memakai list untuk operasi himpunan

Bisa, tapi harus konversi dulu (.toSet()) dan hasilnya perlu .toList() lagi. Jika datanya memang himpunan, simpan sebagai Set dari awal.

Kesimpulan

union (gabung), intersection (irisan), difference (selisih), containsAll (subset). Operasi himpunan mengubah pertanyaan "bandingkan dua grup" menjadi satu baris yang jelas.

Catatan teknis: Operasi himpunan di Dart berjalan dalam O(n) berkat hash table. Implementasi manual dengan loop bersarang bisa O(n²), jadi selalu pakai method bawaan untuk data besar.

Tantangan

Diff daftar hadir

Diberi hadirPagi = {'Budi','Ani','Cici'} dan hadirSiang = {'Ani','Cici','Dedi','Eka'}. Cetak: yang hadir keduanya, yang hanya pagi, dan gabungan semua.

text
void main() {
  var hadirPagi = {'Budi', 'Ani', 'Cici'};
  var hadirSiang = {'Ani', 'Cici', 'Dedi', 'Eka'};
  // TODO: intersection, difference, union
}