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.
Wyzwanie
ŁatwyUtwó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:
- Utwórz zbiór, używając idiomu Go
map[string]struct{}, aby przechowywać unikalne języki programowania - Przetwórz ciąg wejściowy, dzieląc go po przecinkach, aby uzyskać nazwy poszczególnych języków
- Dodaj każdy język do zbioru, używając literału pustej struktury
{}jako wartości - 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]"
- Jeśli języka nie ma jeszcze w zbiorze:
- Po przetworzeniu wszystkich języków wyświetl podsumowanie:
"Total languages processed: [total_count]""Unique languages: [unique_count]"
- Na koniec wypisz wszystkie unikalne języki w zbiorze:
- Nagłówek:
"Programming languages in set:" - Każdy język w osobnym wierszu:
"- [language]"
- Nagłówek:
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]"
}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
1Zaawansowane sterowanie przepływem
Instrukcja switch z `fallthrough`Przerywanie zagnieżdżonych pętliKontynuowanie określonej pętliInstrukcja `goto`Podsumowanie — zaawansowane sterowanie pętlami4Projekt: Prosta lista zadań
Konfiguracja projektuDodawanie zadania2Struktury i metody
Definiowanie metod dla strukturOdbiorniki przez wartośćOdbiorniki przez wskaźnikWybór odbiornikówMetody a funkcjePodsumowanie — działanie struktur5Mapy w szczegółach
Mapy strukturWskaźniki jako wartości mapSprawdzanie, czy mapy są nilPorównywanie mapPodsumowanie — licznik częstości słów3Interfejsy (podstawy)
Czym jest interfejs?Definiowanie interfejsuImplementowanie interfejsuUżywanie typów interfejsowychPusty interfejsAsercje typuPrzełącznik typówPodsumowanie – kształty i zachowaniaPoćwicz samodzielnie: Kompilator Go online