Menu
Coddy logo textTech

Bir Küme Oluşturma

Coddy'nin GO Journey'sinin Mantık ve Akış bölümünün bir parçası — ders 32 / 68.

Go'nun set (küme) deyimi arkasındaki kavramı anladığınıza göre, ilk setinizi oluşturarak bunu uygulamaya koymanın zamanı geldi. Süreç oldukça basittir ve map'lerle zaten öğrenmiş olduğunuz aynı kalıpları takip eder.

Go'da bir küme (set) oluşturmak için, T saklamak istediğiniz öğelerin türü olmak üzere map[T]struct{} desenini kullanarak bir değişken tanımlarsınız. İşte benzersiz renk adlarını saklamak için bir kümeyi nasıl oluşturacağınız:

colors := make(map[string]struct{})

Ayrıca eşleme değişmezi (map literal) sözdizimini kullanarak bir kümeyi bazı başlangıç değerleriyle başlatabilirsiniz:

colors := map[string]struct{}{
    "red":   {},
    "blue":  {},
    "green": {},
}

Her bir değerin boş bir struct literal {} olduğuna dikkat edin. Bu, struct{}'ın sıfır değerini (zero value) oluşturur; bu da anahtarın map içinde var olmasına izin verirken hiç bellek alanı kaplamaz.

Bu yaklaşımın güzelliği, Go'nun mevcut map altyapısından yararlanırken gerçek set semantiği sağlamasıdır; her renk adı yalnızca bir kez görünebilir ve tıpkı normal map'lerde olduğu gibi hızlı arama süreleri elde edersiniz.

quiz iconKendini test et

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

quiz iconKendini test et

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

quiz iconKendini test et

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

challenge icon

Görev

Kolay

Benzersiz öğeleri depolamak için Go set deyimini (idiom) gösteren bir programlama dili tercihi takipçisi oluşturun. Bu zorluk, kopyalar olmadan programlama dillerini takip etmek için map[string]struct{} deseninin nasıl kullanılacağını gösterir.

İki girdi alacaksınız:

  • İşlenecek dillerin sayısını temsil eden bir dize (örneğin, "6")
  • Virgülle ayrılmış programlama dillerini içeren bir dize (örneğin, "Go,Python,JavaScript,Go,Java,Python,C++,JavaScript")

Göreviniz şunları yapmaktır:

  1. Benzersiz programlama dillerini depolamak için Go deyimi olan map[string]struct{} kullanarak bir set oluşturun
  2. Girdi dizesini virgüllerden ayırarak tekil dil adlarını elde etmek için ayrıştırın
  3. Değer olarak boş struct literal {} kullanarak her dili setinize ekleyin
  4. Her dil ile karşılaşıldığında yazdırarak işlem sonuçlarını görüntüleyin:
    • Dil sette yeniyse: "Added: [language]"
    • Dil sette zaten mevcutsa: "Already exists: [language]"
  5. Tüm dilleri işledikten sonra bir özet görüntüleyin:
    • "Total languages processed: [total_count]"
    • "Unique languages: [unique_count]"
  6. Son olarak, setteki tüm benzersiz dilleri listeleyin:
    • Başlık: "Programming languages in set:"
    • Her dil ayrı bir satırda: "- [language]"

Girdi dizesini bölmek için strings paketini ve sayı dizesini bir tam sayıya dönüştürmek için strconv paketini kullanın. Bir dili eklemeden önce sette zaten var olup olmadığını kontrol etmek için comma ok deyimini kullanın: _, exists := languageSet[language]. Bu zorluk, Go set deyiminin benzersiz öğeleri takip etmek ve verilerinizdeki kopyaları önlemek için nasıl verimli bir yol sağladığını gösterir.

Kopya kağıdı

Go'da bir küme (set) oluşturmak için, T'nin öğe türü olduğu map[T]struct{} desenini kullanın:

colors := make(map[string]struct{})

Ayrıca map literal sözdizimini kullanarak bir kümeyi başlangıç değerleriyle başlatabilirsiniz:

colors := map[string]struct{}{
    "red":   {},
    "blue":  {},
    "green": {},
}

Her değer, struct{}'ın sıfır değerini oluşturan ve anahtarın map içinde var olmasına izin verirken hiç bellek alanı kaplamayan boş bir struct literalidir {}.

Bir öğenin kümede var olup olmadığını kontrol etmek için "comma ok" deyimini kullanın:

_, exists := languageSet[language]

Kendin dene

package main

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

func main() {
	// Girdiyi oku
	var countStr string
	var languagesStr string
	fmt.Scanln(&countStr)
	fmt.Scanln(&languagesStr)
	
	// Sayı dizesini tam sayıya dönüştür (bu görev için gerekli değil)
	_, _ = strconv.Atoi(countStr)
	
	// Diller dizesini virgüllere göre ayır
	languages := strings.Split(languagesStr, ",")
	
	// map[string]struct{} yapısını kullanarak bir küme (set) oluştur
	languageSet := make(map[string]struct{})
	
	// TODO: Kodunuzu aşağıya yazın
	// Her bir dili işleyin ve kümede olup olmadığını kontrol edin
	// "comma ok" yapısını kullanın: _, exists := languageSet[language]
	// "Added: [language]" veya "Already exists: [language]" yazdırın
	// Boş struct literal {} kullanarak dilleri kümeye ekleyin
	
	// Özet bilgileri yazdır
	// İşlenen toplam dil sayısını ve benzersiz dil sayısını yazdır
	
	// Kümedeki tüm benzersiz dilleri yazdır
	fmt.Println("Programming languages in set:")
	// Tutarlı çıktı için map'i dilime (slice) dönüştürün ve sıralayın
	// Her dili "- [language]" formatında listeleyin
}
quiz iconKendini test et

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

Mantık ve Akış bölümündeki tüm dersler