Menu
Coddy logo textTech

Tworzenie zbioru

Część sekcji Logika i przepływ sterowania ścieżki GO w Coddy. Lekcja 32 z 68.

Teraz, gdy rozumiesz koncepcję stojącą za idiomem zbioru w Go, czas zastosować ją w praktyce, tworząc swój pierwszy zbiór. Proces jest prosty i opiera się na tych samych wzorcach, których nauczyłeś się już przy mapach.

Aby utworzyć zbiór w Go, deklarujesz zmienną za pomocą wzorca map[T]struct{}, gdzie T jest typem elementów, które chcesz przechowywać. Oto jak utworzyć zbiór do przechowywania unikalnych nazw kolorów:

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

Możesz też zainicjować zbiór początkowymi wartościami, używając składni literału mapy:

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

Zwróć uwagę, że każda wartość jest pustym literałem struktury {}. Tworzy to wartość zerową typu struct{}, która nie zajmuje pamięci, a jednocześnie pozwala, by klucz istniał w mapie.

Piękno tego podejścia polega na tym, że wykorzystuje ono istniejącą infrastrukturę map w Go, zapewniając jednocześnie semantykę prawdziwego zbioru — każda nazwa koloru może wystąpić tylko raz, a wyszukiwanie jest szybkie, tak jak w przypadku zwykłych map.

challenge icon

Wyzwanie

Łatwy

Utwórz narzędzie do śledzenia preferencji dotyczących języków programowania, które demonstruje idiom zbioru w Go służący do przechowywania unikalnych elementów. To wyzwanie pokazuje, jak używać wzorca map[string]struct{} do śledzenia języków programowania bez duplikatów.

Otrzymasz dwa dane wejściowe:

  • Ciąg znaków reprezentujący liczbę języków do przetworzenia (np. "6")
  • Ciąg znaków zawierający języki programowania oddzielone przecinkami (np. "Go,Python,JavaScript,Go,Java,Python,C++,JavaScript")

Twoje zadanie:

  1. Utwórz zbiór, używając idiomu Go map[string]struct{}, aby przechowywać unikalne języki programowania
  2. Przetwórz ciąg wejściowy, dzieląc go po przecinkach, aby uzyskać nazwy poszczególnych języków
  3. Dodaj każdy język do zbioru, używając literału pustej struktury {} jako wartości
  4. Wyświetl wyniki przetwarzania, wypisując każdy napotkany język:
    • Jeśli języka nie ma jeszcze w zbiorze: "Added: [language]"
    • Jeśli język już znajduje się w zbiorze: "Already exists: [language]"
  5. Po przetworzeniu wszystkich języków wyświetl podsumowanie:
    • "Total languages processed: [total_count]"
    • "Unique languages: [unique_count]"
  6. Na koniec wypisz wszystkie unikalne języki w zbiorze:
    • Nagłówek: "Programming languages in set:"
    • Każdy język w osobnym wierszu: "- [language]"

Użyj pakietu strings, aby podzielić ciąg wejściowy, oraz pakietu strconv, aby przekonwertować ciąg z liczbą na liczbę całkowitą. Aby przed dodaniem sprawdzić, czy język już znajduje się w zbiorze, użyj idiomu przecinka i ok: _, exists := languageSet[language]. To wyzwanie pokazuje, jak idiom zbioru w Go zapewnia wydajny sposób śledzenia unikalnych elementów i zapobiegania duplikatom w danych.

Spróbuj swoich sił

package main

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

func main() {
	// Wczytaj dane wejściowe
	var countStr string
	var languagesStr string
	fmt.Scanln(&countStr)
	fmt.Scanln(&languagesStr)
	
	// Przekształć ciąg count na liczbę całkowitą (nie jest to potrzebne w tym zadaniu)
	_, _ = strconv.Atoi(countStr)
	
	// Podziel ciąg languages według przecinków
	languages := strings.Split(languagesStr, ",")
	
	// Utwórz zbiór, używając idiomu map[string]struct{}
	languageSet := make(map[string]struct{})
	
	// TODO: Napisz swój kod poniżej
	// Przetwórz każdy język i sprawdź, czy znajduje się w zbiorze
	// Użyj idiomu comma ok: _, exists := languageSet[language]
	// Wypisz "Added: [language]" lub "Already exists: [language]"
	// Dodaj języki do zbioru, używając literału pustej struktury {}
	
	// Wypisz informacje podsumowujące
	// Wypisz łączną liczbę przetworzonych języków i liczbę unikalnych języków
	
	// Wypisz wszystkie unikalne języki ze zbioru
	fmt.Println("Programming languages in set:")
	// Przekształć map w slice i posortuj, aby uzyskać spójny wynik
	// Wypisz każdy język w formacie "- [language]"
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Logika i przepływ sterowania

Poćwicz samodzielnie: Kompilator Go online