Usuwanie elementów ze zbioru
Część sekcji Logika i przepływ sterowania ścieżki GO w Coddy. Lekcja 35 z 68.
Czasami trzeba usuwać elementy ze zbioru, a Go ułatwia to dzięki wbudowanej funkcji delete(). Ponieważ zbiór jest w rzeczywistości oparty na mapie, usuwanie elementu działa dokładnie tak samo jak usuwanie klucza z mapy.
Aby usunąć element ze zbioru, użyj funkcji delete(), podając swój zbiór i element, który chcesz usunąć:
delete(colors, "red")Funkcja delete() przyjmuje dwa parametry: mapę (twój zbiór) i klucz, który chcesz usunąć. Jeśli element istnieje w zbiorze, zostaje usunięty. Jeśli element nie istnieje, funkcja nic nie robi — nie jest zgłaszany żaden błąd.
To zachowanie doskonale sprawdza się w przypadku zbiorów, ponieważ często chcesz mieć pewność, że danego elementu nie ma, niezależnie od tego, czy znajdował się tam początkowo. Operacja jest szybka i wydajna, dzięki czemu zachowuje zalety wydajnościowe wynikające z implementacji mapy używanej przez Go.
Wyzwanie
ŁatwyStwórz system zarządzania książkami w bibliotece, który usuwa książki z kolekcji różnych gatunków, używając idiomu zbioru w Go. To wyzwanie pokazuje, jak używać funkcji delete() do usuwania elementów ze zbiorów i śledzenia procesu usuwania.
Otrzymasz dwa dane wejściowe:
- Łańcuch znaków zawierający książki z kolekcji beletrystyki, rozdzielone przecinkami (np.
"1984,Dune,Foundation,Neuromancer,Brave New World") - Łańcuch znaków zawierający książki do usunięcia, rozdzielone przecinkami (np.
"Dune,Harry Potter,Foundation,Twilight,1984")
Twoim zadaniem jest:
- Utworzyć zbiór przy użyciu idiomu Go
map[string]struct{}, aby przechowywać książki beletrystyczne - Przeanalizować pierwszy łańcuch wejściowy, dzieląc go po przecinkach, aby uzyskać poszczególne tytuły książek
- Dodać każdą książkę do zbioru, używając pustego literału struktury
{}jako wartości - Przeanalizować drugi łańcuch wejściowy, dzieląc go po przecinkach, aby uzyskać listę książek do usunięcia
- Dla każdej książki do usunięcia sprawdzić, czy istnieje w zbiorze, używając idiomu comma ok
- Wyświetlić przebieg usuwania dla każdej przetwarzanej książki:
- Jeśli książka istnieje w kolekcji:
"Removing: [book_title]" - Jeśli książka nie istnieje w kolekcji:
"Not found: [book_title]"
- Jeśli książka istnieje w kolekcji:
- Użyć funkcji
delete(), aby usunąć książki istniejące w zbiorze - Po przetworzeniu wszystkich żądań usunięcia wyświetlić podsumowanie:
"Initial collection size: [initial_count]""Removal requests: [requests_count]""Books successfully removed: [removed_count]""Books not found: [not_found_count]""Final collection size: [final_count]"
- Na koniec wyświetlić listę wszystkich pozostałych książek w kolekcji:
- Nagłówek:
"Remaining books in fiction collection:" - Każda książka w osobnym wierszu:
"- [book_title]" - Jeśli nie pozostały żadne książki:
"- Collection is empty"
- Nagłówek:
Użyj pakietu strings, aby podzielić łańcuchy wejściowe po przecinkach. To wyzwanie pokazuje, jak funkcja delete() bezpiecznie usuwa elementy ze zbioru w Go i nie powoduje błędów nawet podczas próby usunięcia nieistniejących elementów, dzięki czemu świetnie nadaje się do operacji porządkowych.
Spróbuj swoich sił
package main
import (
"bufio"
"fmt"
"os"
"sort"
"strings"
)
func main() {
// Odczytaj dane wejściowe za pomocą Scanner, aby obsługiwać tytuły książek zawierające spacje
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
fictionBooks := scanner.Text()
scanner.Scan()
booksToRemove := scanner.Text()
// Przeanalizuj ciągi wejściowe
fictionList := strings.Split(fictionBooks, ",")
removeList := strings.Split(booksToRemove, ",")
// TODO: Napisz swój kod poniżej
// 1. Utwórz zbiór za pomocą map[string]struct{} do przechowywania książek beletrystycznych
// 2. Dodaj każdą książkę z fictionList do zbioru
// 3. Przetwórz każdą książkę w removeList i sprawdź, czy istnieje
// 4. Wyświetl przebieg usuwania i użyj funkcji delete()
// 5. Wyświetl statystyki podsumowujące
// 6. Wypisz pozostałe książki w kolekcji
// Pamiętaj, aby posortować pozostałe książki, by zapewnić spójną kolejność wyników
_ = sort.Strings // usuń ten wiersz, gdy zaczniesz używać sort
_ = fmt.Println // usuń ten wiersz, gdy zaczniesz używać fmt
}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