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
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:
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
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
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.
void main() {
var hadirPagi = {'Budi', 'Ani', 'Cici'};
var hadirSiang = {'Ani', 'Cici', 'Dedi', 'Eka'};
// TODO: intersection, difference, union
}