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 deyiminin 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ı izler.
Go'da bir küme (set) oluşturmak için, map[T]struct{} desenini kullanarak bir değişken tanımlarsınız; burada T, saklamak istediğiniz öğelerin türüdür. Benzersiz renk adlarını saklamak için bir kümeyi şu şekilde oluşturabilirsiniz:
colors := make(map[string]struct{})Ayrıca map literal sözdizimini kullanarak bir set'i bazı başlangıç değerleriyle başlatabilirsiniz.
colors := map[string]struct{}{
"red": {},
"blue": {},
"green": {},
}Her bir değerin nasıl boş bir struct literal'ı {} olduğuna dikkat edin. Bu, anahtarın map içinde var olmasına izin vermeye devam ederken hiç bellek alanı kaplamayan struct{}'ın sıfır değerini (zero value) oluşturur.
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.
Görev
KolayBenzersiz öğeleri depolamak için Go set deyimini (idiom) gösteren bir programlama dili tercihi takipçisi oluşturun. Bu zorluk, programlama dillerini kopyalar olmadan 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 şunlardır:
- Benzersiz programlama dillerini depolamak için Go deyimi olan
map[string]struct{}kullanarak bir set oluşturun - Girdi dizesini virgüllerden ayırarak tekil dil adlarını elde etmek için ayrıştırın
- Değer olarak boş struct literal
{}kullanarak her dili setinize ekleyin - Her dili karşılaşıldığı anda yazdırarak işlem sonuçlarını görüntüleyin:
- Dil sete yeniyse:
"Added: [language]" - Dil sette zaten mevcutsa:
"Already exists: [language]"
- Dil sete yeniyse:
- Tüm dilleri işledikten sonra bir özet görüntüleyin:
"Total languages processed: [total_count]""Unique languages: [unique_count]"
- Son olarak, setteki tüm benzersiz dilleri listeleyin:
- Başlık:
"Programming languages in set:" - Her dil ayrı bir satırda:
"- [language]"
- Başlık:
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.
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)
// Dilleri virgüllere göre ayır
languages := strings.Split(languagesStr, ",")
// map[string]struct{} deyimini kullanarak bir küme (set) oluştur
languageSet := make(map[string]struct{})
// TODO: Kodunuzu aşağıya yazın
// Her bir dili işle ve kümede olup olmadığını kontrol et
// comma ok deyimini kullan: _, exists := languageSet[language]
// "Added: [language]" veya "Already exists: [language]" yazdır
// Boş struct literal {} kullanarak dilleri kümeye ekle
// Ö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 slice'a dönüştürün ve sıralayın
// Her bir dili "- [language]" formatıyla listeleyin
}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
1İleri Seviye Kontrol Akışı
`fallthrough` ile Switchİç İçe Döngülerden ÇıkmaBelirli Bir Döngüye Devam Etme`goto` İfadesiÖzet - İleri Seviye Döngü Kontrolü4Proje: Basit Görev Listesi
Proje KurulumuGörev Ekleme2Structlar ve Metotlar
Structlarda Metot TanımlamaValue Receiver'larPointer Receiver'larReceiver SeçimiMetotlar ve FonksiyonlarÖzet - Struct Davranışı5Derinlemesine Map'ler
Struct Map'leriMap Değeri Olarak Pointer'larNil Map KontrolüMap'leri KarşılaştırmaÖzet - Kelime Frekansı Sayacı3Arayüzler (Temeller)
Arayüz Nedir?Bir Arayüz TanımlamaBir Arayüzü UygulamaArayüz Tiplerini KullanmaBoş ArayüzTip OnaylamalarıTip SeçimiÖzet - Şekiller ve Davranışlar6Deyimsel Go: Kümeler
Go'da Küme DeyimiBir Küme OluşturmaKümeye Eleman EklemeEleman Varlığını Kontrol EtmeKümeden Eleman SilmeKüme Üzerinde YinelemeÖzet - Benzersiz Kullanıcı Adları