Menu
Coddy logo textTech

sort.Interface Arayüzü

Coddy'nin GO Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 74 / 107.

sort paketi, arayüz tabanlı tasarımın bir başka mükemmel örneğini sunar. Özel bir koleksiyonu sıralamak için türünüzün sort.Interface arayüzünü uygulaması gerekir:

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

Bu üç yöntem, sıralama algoritmasına ihtiyaç duyduğu her şeyi sağlar: koleksiyonun uzunluğu, öğeleri karşılaştırmanın bir yolu ve öğelerin yerlerini değiştirme yöntemi. Özel struct'lardan oluşan bir dilimi sıralanabilir hâle getirme yöntemi şöyledir:

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}]
}

Temel fikir, diliminize dayalı adlandırılmış bir tür (ByAge) oluşturmaktır. Bu, aynı veriler için farklı sıralama davranışları tanımlamanı sağlar. Bunun yerine alfabetik olarak sıralamak için farklı bir Less uygulamasıyla ByName oluşturabilirsin.

Türünüz sort.Interface arayüzünü sağladığında, sort.Sort(), sort.Reverse() ve sort.IsSorted() ile otomatik olarak çalışır.

challenge icon

Görev

Kolay

Go'nun sort.Interface gücünü gösteren sıralanabilir bir ürün envanteri sistemi oluşturalım! Bir Product türü oluşturacak ve aynı koleksiyonun farklı şekillerde sıralanabilmesini sağlayan birden çok sıralama stratejisi uygulayacaksın.

Kodunu iki dosya arasında düzenleyeceksin:

  • product.go: Ürün türünü ve sıralama uygulamalarını tanımla.

    Üç alanı olan bir Product struct'ı oluştur: Name (string), Price (float64) ve Quantity (int).

    []Product temel alınarak iki adlandırılmış tür oluştur:

    • ByPrice - ürünleri artan fiyata göre sıralamak için
    • ByQuantity - ürünleri azalan miktara göre sıralamak için (en yüksek miktar önce)

    Her türün, sort.Interface tarafından gerekli olan üç yöntemi uygulaması gerekir: Len(), Less(i, j int) ve Swap(i, j int). Less yöntemi, her tür için sıralama düzenini belirler.

  • main.go: Ürün envanterini oluştur ve sırala.

    Bir sıralama modu (price veya quantity) oku, ardından ürün sayısını ve ürün ayrıntılarını oku. Her ürün üç satır olarak sağlanır: ad, fiyat ve miktar.

    Ürünlerden oluşan bir dilim oluştur, moda göre uygun sıralama türünü kullanarak sırala ve ardından her ürünü şu biçimde yazdır:

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

    Fiyatları iki ondalık basamakla görüntüle.

Aşağıdaki girdiler sağlanacaktır:

  • 1. satır: Sıralama modu (price veya quantity)
  • 2. satır: Ürün sayısı
  • Sonraki satırlar: Ürün ayrıntıları (ad, fiyat, miktar - ürün başına üç satır)

Örneğin, aşağıdaki verildiğinde:

price
3
Laptop
999.99
5
Mouse
29.99
50
Keyboard
79.99
25

Çıktın şöyle olmalıdır:

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

Ve aşağıdaki verildiğinde:

quantity
3
Laptop
999.99
5
Mouse
29.99
50
Keyboard
79.99
25

Çıktın şöyle olmalıdır:

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

Aynı ürün verilerinin, yalnızca farklı bir adlandırılmış tür kullanılarak nasıl farklı biçimlerde sıralanabildiğine dikkat et. Türlerin sort.Interface koşullarını karşılamasının ardından standart kitaplıktaki sort.Sort() ile sorunsuz şekilde çalışırlar.

Kendin dene

package main

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

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

	// Sıralama modunu oku
	var mode string
	fmt.Fscanln(reader, &mode)

	// Ürün sayısını oku
	var count int
	fmt.Fscanln(reader, &count)

	// Ürünleri oku
	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: Ürünleri moda göre sırala
	// mode "price" ise ByPrice tipini kullan
	// mode "quantity" ise ByQuantity tipini kullan
	// Uygun tip ile sort.Sort() kullan

	// TODO: Her ürünü şu formatta yazdır:
	// [Name]: $[Price] (x[Quantity])
	// Fiyat biçimlendirmesi için %.2f ile fmt.Printf kullan
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online Go derleyicisi