Skip to content

Commit 0c17907

Browse files
authored
chore: menambahkan abstraksi tipe Set generic di golang (#64)
1 parent c926cbf commit 0c17907

File tree

2 files changed

+168
-0
lines changed

2 files changed

+168
-0
lines changed
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
# Set di Golang (Generic Abstract Type)
2+
3+
Dalam bahasa Go, **`Set`** bukanlah tipe bawaan. Namun, kita bisa membuat **abstraksi tipe `Set`** sendiri menggunakan **`map[K]struct{}`**.
4+
Tipe ini sangat berguna untuk **menyimpan elemen unik** (tidak duplikat), melakukan operasi seperti **pengecekan keanggotaan**, **union**, **intersection**, dan **difference**.
5+
6+
---
7+
8+
## **Deklarasi Tipe Set**
9+
10+
```go
11+
type Set[K comparable] map[K]struct{}
12+
```
13+
14+
- `K comparable` → artinya kunci (`key`) harus bertipe yang bisa dibandingkan (`string`, `int`, dll).
15+
- `struct{}` dipakai sebagai nilai karena ringan (tanpa konsumsi memori tambahan).
16+
17+
---
18+
19+
## **Operasi Dasar pada Set**
20+
21+
### 1. Membuat Set & Menambahkan Elemen
22+
23+
```go
24+
set := Set[string]{}
25+
set.Add("A")
26+
set.Add("B")
27+
```
28+
29+
### 2. Mengecek Keanggotaan
30+
31+
```go
32+
fmt.Println(set.Contains("A")) // true
33+
fmt.Println(set.Contains("C")) // false
34+
```
35+
36+
### 3. Menghapus Elemen
37+
38+
```go
39+
set.Remove("A")
40+
fmt.Println(set.Contains("A")) // false
41+
```
42+
43+
### 4. Menambahkan Semua Elemen dari Set Lain (Union)
44+
45+
```go
46+
set2 := Set[string]{}
47+
set2.Add("X")
48+
set2.Add("Y")
49+
50+
set.AddAll(set2)
51+
fmt.Println(set) // {"B","X","Y"}
52+
```
53+
54+
### 5. Menyisakan Elemen yang Sama (Intersection)
55+
56+
```go
57+
set.RetainAll(set2)
58+
fmt.Println(set) // {"X","Y"}
59+
```
60+
61+
### 6. Menghapus Semua Elemen yang Ada di Set Lain (Difference)
62+
63+
```go
64+
set3 := Set[string]{}
65+
set3.Add("X")
66+
67+
set.RemoveAll(set3)
68+
fmt.Println(set) // {"Y"}
69+
```
70+
71+
---
72+
73+
## **Keterbatasan**
74+
75+
- Tipe generik `Set[K]` hanya bisa digunakan untuk **tipe yang comparable**.
76+
- Tidak bisa langsung menghapus `Set[int]` dari `Set[string]`, karena beda tipe.
77+
78+
---
79+
80+
## **Perbedaan dengan Slice**
81+
82+
| Aspek | `Set` | `Slice` |
83+
| ----------------- | ------------------------------- | --------------------- |
84+
| Duplikat Elemen | Tidak boleh | Boleh |
85+
| Operasi Pencarian | Sangat cepat (O(1)) | Lebih lambat (O(n)) |
86+
| Urutan Elemen | Tidak terjamin | Terjaga sesuai urutan |
87+
| Cocok untuk | Membership, union, intersection | Data berurutan, list |
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
// Package main
2+
package main
3+
4+
import (
5+
"fmt"
6+
)
7+
8+
// Definisi generic Set
9+
type Set[K comparable] map[K]struct{}
10+
11+
// Tambah elemen
12+
func (s Set[K]) Add(val K) {
13+
s[val] = struct{}{}
14+
}
15+
16+
// Hapus elemen
17+
func (s Set[K]) Remove(val K) {
18+
delete(s, val)
19+
}
20+
21+
// Cek apakah elemen ada
22+
func (s Set[K]) Contains(val K) bool {
23+
_, ok := s[val]
24+
return ok
25+
}
26+
27+
// Tambah semua elemen dari set lain
28+
func (s Set[K]) AddAll(other Set[K]) {
29+
for k := range other {
30+
s.Add(k)
31+
}
32+
}
33+
34+
// Pertahankan hanya elemen yang juga ada di set lain
35+
func (s *Set[K]) RetainAll(other Set[K]) {
36+
sNew := Set[K]{}
37+
for v := range other {
38+
if s.Contains(v) {
39+
sNew.Add(v)
40+
}
41+
}
42+
*s = sNew
43+
}
44+
45+
// Hapus semua elemen yang ada di set lain
46+
func (s Set[K]) RemoveAll(other Set[K]) {
47+
for v := range other {
48+
s.Remove(v)
49+
}
50+
}
51+
52+
// Hitung jumlah elemen
53+
func (s Set[K]) Len() int {
54+
return len(s)
55+
}
56+
57+
// Contoh penggunaan
58+
func main() {
59+
// 1. Membuat Set dan menambahkan elemen
60+
set := Set[string]{}
61+
set.Add("A")
62+
set.Add("B")
63+
set.Add("C")
64+
fmt.Println("Set awal:", set)
65+
66+
// 2. Mengecek apakah elemen ada
67+
fmt.Println("Apakah ada 'A'?", set.Contains("A"))
68+
fmt.Println("Apakah ada 'Z'?", set.Contains("Z"))
69+
70+
// 3. Menghapus elemen
71+
set.Remove("A")
72+
fmt.Println("Set setelah menghapus 'A':", set)
73+
74+
// 4. Union (gabung set lain)
75+
set2 := Set[string]{}
76+
set2.Add("B")
77+
set2.Add("X")
78+
set2.Add("Y")
79+
set.AddAll(set2)
80+
fmt.Println("Set setelah AddAll set2:", set)
81+
}

0 commit comments

Comments
 (0)