Menu
CoddyTech

sort.Interface

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan GO di Coddy. Pelajaran 74 dari 107.

Package sort memberikan contoh lain yang sangat baik tentang desain berbasis interface. Untuk mengurutkan koleksi kustom, tipe kamu harus mengimplementasikan sort.Interface:

type Interface interface {
    Len() int
    Less(i, j int) bool
    Swap(i, j int)
}

Ketiga method ini memberikan semua yang dibutuhkan algoritma pengurutan: panjang koleksi, cara membandingkan elemen, dan cara menukarnya. Berikut cara membuat slice berisi struct kustom agar bisa diurutkan:

type Person struct {
    Name string
    Age  int
}

type ByAge []Person

func (a ByAge) Len() int           { return len(a) }
func (a ByAge) Less(i, j int) bool { return a[i].Age < a[j].Age }
func (a ByAge) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }

func main() {
    people := []Person{
        {"Alice", 30},
        {"Bob", 25},
        {"Carol", 35},
    }
    
    sort.Sort(ByAge(people))
    fmt.Println(people)
    // [{Bob 25} {Alice 30} {Carol 35}]
}

Gagasan utamanya adalah membuat tipe bernama (ByAge) berdasarkan slice-mu. Dengan begitu, kamu bisa menentukan perilaku pengurutan yang berbeda untuk data yang sama. Kamu bisa membuat ByName dengan implementasi Less yang berbeda untuk mengurutkan secara alfabetis.

Setelah tipe milikmu memenuhi sort.Interface, tipe tersebut otomatis dapat digunakan dengan sort.Sort(), sort.Reverse(), dan sort.IsSorted().

challenge icon

Tantangan

Mudah

Mari buat sistem inventaris produk yang dapat diurutkan untuk menunjukkan kehebatan sort.Interface milik Go! Kamu akan membuat tipe Product dan mengimplementasikan beberapa strategi pengurutan, sehingga koleksi yang sama dapat diurutkan dengan cara yang berbeda.

Kamu akan mengatur kodemu dalam dua file:

  • product.go: Definisikan tipe produk dan implementasi pengurutan.

    Buat struct Product dengan tiga field: Name (string), Price (float64), dan Quantity (int).

    Buat dua tipe bernama berdasarkan []Product:

    • ByPrice - untuk mengurutkan produk berdasarkan harga dari yang terendah ke tertinggi
    • ByQuantity - untuk mengurutkan produk berdasarkan jumlah dari yang tertinggi ke terendah (jumlah terbanyak lebih dulu)

    Setiap tipe harus mengimplementasikan tiga method yang diwajibkan oleh sort.Interface: Len(), Less(i, j int), dan Swap(i, j int). Method Less menentukan urutan pengurutan untuk setiap tipe.

  • main.go: Buat dan urutkan inventaris produkmu.

    Baca mode pengurutan (price atau quantity), lalu baca jumlah produk yang diikuti detail produk. Setiap produk diberikan dalam tiga baris: nama, harga, dan jumlah.

    Buat slice produk, urutkan menggunakan tipe pengurutan yang sesuai berdasarkan mode, lalu cetak setiap produk dengan format ini:

    [Name]: $[Price] (x[Quantity])

    Tampilkan harga dengan dua angka di belakang koma.

Input berikut akan diberikan:

  • Baris 1: Mode pengurutan (price atau quantity)
  • Baris 2: Jumlah produk
  • Baris berikutnya: Detail produk (nama, harga, jumlah, tiga baris untuk setiap produk)

Contohnya, jika diberikan:

price
3
Laptop
999.99
5
Mouse
29.99
50
Keyboard
79.99
25

Outputmu seharusnya:

Mouse: $29.99 (x50)
Keyboard: $79.99 (x25)
Laptop: $999.99 (x5)

Jika diberikan:

quantity
3
Laptop
999.99
5
Mouse
29.99
50
Keyboard
79.99
25

Outputmu seharusnya:

Mouse: $29.99 (x50)
Keyboard: $79.99 (x25)
Laptop: $999.99 (x5)

Perhatikan bagaimana data produk yang sama dapat diurutkan dengan cara berbeda hanya dengan menggunakan tipe bernama yang berbeda. Setelah tipemu memenuhi sort.Interface, tipe tersebut dapat digunakan dengan mudah bersama sort.Sort() dari standard library.

Coba sendiri

package main

import (
	"bufio"
	"fmt"
	"os"
	"sort"
	"strconv"
	"strings"
)

func main() {
	reader := bufio.NewReader(os.Stdin)

	// Baca mode pengurutan
	var mode string
	fmt.Fscanln(reader, &mode)

	// Baca jumlah produk
	var count int
	fmt.Fscanln(reader, &count)

	// Baca data produk
	products := make([]Product, count)
	for i := 0; i < count; i++ {
		name, _ := reader.ReadString('\n')
		name = strings.TrimSpace(name)

		priceStr, _ := reader.ReadString('\n')
		priceStr = strings.TrimSpace(priceStr)
		price, _ := strconv.ParseFloat(priceStr, 64)

		qtyStr, _ := reader.ReadString('\n')
		qtyStr = strings.TrimSpace(qtyStr)
		quantity, _ := strconv.Atoi(qtyStr)

		products[i] = Product{Name: name, Price: price, Quantity: quantity}
	}

	// TODO: Urutkan produk berdasarkan mode
	// Jika mode adalah "price", gunakan tipe ByPrice
	// Jika mode adalah "quantity", gunakan tipe ByQuantity
	// Gunakan sort.Sort() dengan tipe yang sesuai

	// TODO: Tampilkan setiap produk dalam format:
	// [Name]: $[Price] (x[Quantity])
	// Gunakan fmt.Printf dengan %.2f untuk memformat harga
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler Go online