Konwersja listy na zbiór
Część sekcji Logika i przepływ sterowania ścieżki Dart w Coddy. Lekcja 21 z 65.
Jednym z najbardziej praktycznych zastosowań Set jest usuwanie zduplikowanych elementów z List. Ponieważ zbiory automatycznie eliminują duplikaty, możesz łatwo przekształcić listę zawierającą powtarzające się wartości w kolekcję unikalnych elementów.
Aby przekształcić List w Set, wystarczy przekazać listę do konstruktora Set.from(). Tworzy to nowy zbiór zawierający wszystkie unikalne elementy z oryginalnej listy.
List<int> numbersWithDuplicates = [1, 2, 2, 3, 3, 3, 4, 5, 5];
Set<int> uniqueNumbers = Set.from(numbersWithDuplicates);
print(uniqueNumbers); // {1, 2, 3, 4, 5}Jeśli potrzebujesz wyniku z powrotem w postaci List (być może w celu zachowania zgodności z innymi częściami kodu), możesz ponownie przekonwertować zbiór na listę za pomocą toList(). Otrzymasz listę zawierającą tylko unikalne elementy z oryginalnej listy.
List<int> uniqueList = Set.from(numbersWithDuplicates).toList();
print(uniqueList); // [1, 2, 3, 4, 5]Ten wzorzec Lista → Zbiór → Lista jest niezwykle często stosowany, gdy trzeba oczyścić dane przez usunięcie duplikatów, zachowując strukturę listy do dalszego przetwarzania.
Wyzwanie
ŁatwyUtwórz program, który zarządza systemem czyszczenia danych, usuwając zduplikowane wpisy z odpowiedzi w ankiecie. Twój program powinien:
- Wczytać dane wejściowe w postaci ciągu znaków reprezentującego tytuł ankiety
- Wczytać wiele ciągów znaków reprezentujących odpowiedzi w ankiecie (wczytywanie zakończy się po otrzymaniu
"responses_done") - Utworzyć List do przechowywania wszystkich pierwotnych odpowiedzi (w tym duplikatów)
- Użyć
Set.from(), aby przekonwertować List na Set, automatycznie usuwając duplikaty - Użyć
toList(), aby ponownie przekonwertować Set na List zawierający unikalne odpowiedzi - Wypisać wyniki czyszczenia danych w dokładnie takim formacie, jak pokazano poniżej
Na przykład, jeśli tytuł ankiety to "Customer Satisfaction Survey", a odpowiedzi to "Excellent", "Good", "Excellent", "Fair", "Good", "Excellent", "Poor", program powinien wypisać:
Survey: Customer Satisfaction Survey
Original responses: [Excellent, Good, Excellent, Fair, Good, Excellent, Poor]
Total responses collected: 7
Converting to Set to remove duplicates...
Unique responses (Set): {Excellent, Good, Fair, Poor}
Converting back to List...
Cleaned responses: [Excellent, Good, Fair, Poor]
Duplicates removed: 3
Final unique responses: 4
Status: Data cleaning completed successfullyJeśli tytuł ankiety to "Product Feedback", a odpowiedzi to "Like", "Dislike", "Like", "Like", program powinien wypisać:
Survey: Product Feedback
Original responses: [Like, Dislike, Like, Like]
Total responses collected: 4
Converting to Set to remove duplicates...
Unique responses (Set): {Like, Dislike}
Converting back to List...
Cleaned responses: [Like, Dislike]
Duplicates removed: 2
Final unique responses: 2
Status: Data cleaning completed successfullyJeśli tytuł ankiety to "Event Rating", a odpowiedzi to "Amazing", "Okay", "Great", program powinien wypisać:
Survey: Event Rating
Original responses: [Amazing, Okay, Great]
Total responses collected: 3
Converting to Set to remove duplicates...
Unique responses (Set): {Amazing, Okay, Great}
Converting back to List...
Cleaned responses: [Amazing, Okay, Great]
Duplicates removed: 0
Final unique responses: 3
Status: Data cleaning completed successfullyTwój program musi pokazywać pełny schemat List → Set → List. Najpierw zapisz wszystkie odpowiedzi w List, następnie użyj Set.from(), aby utworzyć Set na podstawie List, a na koniec użyj toList(), aby ponownie przekonwertować Set na List. Oblicz liczbę usuniętych duplikatów, odejmując końcową liczbę unikalnych odpowiedzi od pierwotnej łącznej liczby odpowiedzi.
Spróbuj swoich sił
import 'dart:io';
void main() {
// Odczytaj tytuł ankiety
String? surveyTitle = stdin.readLineSync();
// Odczytuj odpowiedzi na ankietę aż do "responses_done"
List<String> originalResponses = [];
String? response;
while ((response = stdin.readLineSync()) != "responses_done") {
if (response != null) {
originalResponses.add(response);
}
}
// TODO: Napisz poniżej swój kod
// 1. Użyj Set.from(), aby przekształcić listę w Set (usuwa duplikaty)
// 2. Użyj toList(), aby przekształcić Set z powrotem w List
// 3. Oblicz liczbę usuniętych duplikatów i końcową liczbę odpowiedzi
// Wyświetl wyniki w wymaganym formacie
print("Survey: $surveyTitle");
print("Original responses: $originalResponses");
// Dodaj tutaj pozostałe instrukcje print
}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
1Zaawansowana manipulacja listami
Właściwości listy: first i lastStan listy: isEmpty i isNotEmpOdwracanie listyDodawanie do listy: insertUsuwanie z listy: removeWhereWyszukiwanie na liście: indexOfSortowanie listyMieszanie elementów listyPodsumowanie – Organizator listy4Zaawansowane operacje na mapach
Iterowanie po mapieSprawdzanie kluczy i wartościWłaściwości mapy: klucze i wartościDodawanie warunkowe: putIfAbsentUsuwanie wpisów z mapyZagnieżdżone mapyPodsumowanie – aktualizacja stanu magazynowego2Operacje funkcyjne na listach
Przekształcanie za pomocą 'map'Filtrowanie za pomocą 'where'Używanie '.toList()'Sprawdzanie warunków za pomocą 'any'Warunki z użyciem 'every'Wyszukiwanie za pomocą 'firstWhere'Podsumowanie — filtrowanie danych5Projekt: Kalkulator koszyka zakupowego
Konfiguracja projektuDodawanie produktów do koszyka3Zbiory
Czym jest zbiór?Tworzenie zbioruDodawanie i usuwanie elementów ze zbiorówSprawdzanie, czy element znajduje się w zbiorzeKonwersja listy na zbiórSuma zbiorówCzęść wspólna zbiorówRóżnica zbiorówPodsumowanie — unikalna lista gościPoćwicz samodzielnie: Kompilator Dart online