Dodawanie elementów do zbioru
Część sekcji Logika i przepływ sterowania ścieżki GO w Coddy. Lekcja 33 z 68.
Teraz, gdy masz już utworzony zbiór, kolejnym krokiem jest nauczenie się, jak dodawać do niego elementy. Ponieważ zbiór w Go jest w rzeczywistości mapą, dodawanie elementu do zbioru jest identyczne z dodawaniem klucza do mapy.
Aby dodać element do swojego zbioru, wystarczy przypisać pustą wartość struktury do nowego klucza:
colors["yellow"] = struct{}{}Składnia struct{}{} tworzy pusty literał struktury. Pierwsze struct{} określa typ, a drugie {} go inicjalizuje. To standardowy sposób dodawania elementów do zbioru w Go.
Zaletą tego podejścia jest to, że jeśli spróbujesz ponownie dodać ten sam element, po prostu nadpisze on istniejący wpis, zachowując unikatowość zbioru.
Zwróć uwagę, że struct{}{} to jedyna poprawna składnia dla tego przypisania: zapisanie samego {} bez nazwy typu powoduje błąd kompilacji: missing type in composite literal. Typ musi być zawsze podany jawnie przy przypisywaniu wartości do klucza mapy poza literałem mapy.
Dodawanie elementów do zbioru jest szybkie i proste. Wykorzystuje wydajną implementację mapy w Go, zapewniając jednocześnie prawdziwe działanie zbioru do śledzenia unikalnych elementów.
Wyzwanie
ŁatwyZbuduj system śledzenia umiejętności, który zarządza umiejętnościami technicznymi programisty przy użyciu idiomu zbioru w Go. To wyzwanie pokazuje, jak dodawać nowe umiejętności do zbioru, zapobiegając duplikatom i śledząc postępy w nauce.
Otrzymasz dwa dane wejściowe:
- Ciąg znaków reprezentujący oczekiwaną liczbę umiejętności (np.
"5") — służy wyłącznie jako informacja - Ciąg znaków zawierający umiejętności oddzielone przecinkami (np.
"Go,Docker,Kubernetes,Go,React,Docker,Python")
Twoim zadaniem jest:
- Utworzyć zbiór za pomocą idiomu Go
map[string]struct{}, aby przechowywać unikalne umiejętności techniczne - Zainicjalizować zbiór trzema umiejętnościami początkowymi:
"Programming","Problem Solving"i"Communication" - Przeanalizować wejściowy ciąg znaków, dzieląc go po przecinkach, aby uzyskać nazwy poszczególnych umiejętności
- Przetworzyć wszystkie umiejętności z ciągu rozdzielonego przecinkami (iterować przez cały wycinek, nie używając parametru liczby)
- Dodać każdą umiejętność z danych wejściowych do zbioru, używając
struct{}{}jako wartości - Wyświetlić wyniki przetwarzania, wypisując każdą umiejętność w trakcie jej przetwarzania:
- Jeśli umiejętności nie ma jeszcze w zbiorze:
"Learning new skill: [skill]" - Jeśli umiejętność już znajduje się w zbiorze:
"Already mastered: [skill]"
- Jeśli umiejętności nie ma jeszcze w zbiorze:
- Po przetworzeniu wszystkich umiejętności wyświetlić podsumowanie postępów:
"Skills processed: [total_processed]"— użyj długości wycinka umiejętności"New skills learned: [new_skills_count]""Total skills mastered: [total_unique_skills]"
- Na koniec wyświetlić wszystkie umiejętności w zbiorze umiejętności programisty:
- Nagłówek:
"Complete skill set:" - Każda umiejętność w osobnym wierszu:
"✓ [skill]"
- Nagłówek:
Ważne: Użyj range, aby iterować przez wszystkie umiejętności w wycinku, a nie parametru liczby. Liczba jest podana w celach informacyjnych, ale nie powinna sterować pętlą. Użyj pakietu strings, aby podzielić wejściowy ciąg znaków. Aby sprawdzić, czy umiejętność już istnieje przed jej dodaniem, użyj idiomu przecinek-ok: _, exists := skillSet[skill]. To wyzwanie pokazuje, jak dodawanie elementów do zbioru w Go automatycznie zapewnia unikalność, a jednocześnie umożliwia szybkie sprawdzanie przynależności.
Spróbuj swoich sił
package main
import (
"fmt"
"sort"
"strconv"
"strings"
)
func main() {
// Wczytaj dane wejściowe
var countStr string
var skillsStr string
fmt.Scanln(&countStr)
fmt.Scanln(&skillsStr)
// Przekształć ciąg znaków z liczbą elementów na liczbę całkowitą (tylko informacyjnie — nie jest używana w pętli)
_, _ = strconv.Atoi(countStr)
// Zainicjalizuj zbiór umiejętności umiejętnościami początkowymi
skillSet := map[string]struct{}{
"Programming": struct{}{},
"Problem Solving": struct{}{},
"Communication": struct{}{},
}
// Podziel ciąg znaków z umiejętnościami na poszczególne umiejętności
skills := strings.Split(skillsStr, ",")
// TODO: Napisz swój kod poniżej
// Przetwórz każdą umiejętność, używając range do przejścia przez WSZYSTKIE umiejętności w wycinku
// Użyj idiomu comma ok: _, exists := skillSet[skill]
// Dodaj nowe umiejętności za pomocą: skillSet[skill] = struct{}{}
// Wyświetl wyniki przetwarzania każdej umiejętności
// Oblicz i wyświetl podsumowanie postępów, używając len(skills)
// Wypisz wszystkie umiejętności z pełnego zbioru umiejętności (rozważ sortowanie, aby uzyskać spójną kolejność wyników)
}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 zachowania6Idiomatyczny Go: zbiory
Idiom zbioru w GoTworzenie zbioruDodawanie elementów do zbioruSprawdzanie przynależnościUsuwanie elementów ze zbioruIterowanie po zbiorzePodsumowanie – unikalne nazwy użytkownikówPoćwicz samodzielnie: Kompilator Go online