Menu
Coddy logo textTech

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.

challenge icon

Wyzwanie

Łatwy

Zbuduj 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:

  1. Utworzyć zbiór za pomocą idiomu Go map[string]struct{}, aby przechowywać unikalne umiejętności techniczne
  2. Zainicjalizować zbiór trzema umiejętnościami początkowymi: "Programming", "Problem Solving" i "Communication"
  3. Przeanalizować wejściowy ciąg znaków, dzieląc go po przecinkach, aby uzyskać nazwy poszczególnych umiejętności
  4. Przetworzyć wszystkie umiejętności z ciągu rozdzielonego przecinkami (iterować przez cały wycinek, nie używając parametru liczby)
  5. Dodać każdą umiejętność z danych wejściowych do zbioru, używając struct{}{} jako wartości
  6. 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]"
  7. 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]"
  8. 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]"

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)
	
}
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