Menu
Coddy logo textTech

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.

challenge icon

Wyzwanie

Łatwy

Utwórz program, który zarządza systemem czyszczenia danych, usuwając zduplikowane wpisy z odpowiedzi w ankiecie. Twój program powinien:

  1. Wczytać dane wejściowe w postaci ciągu znaków reprezentującego tytuł ankiety
  2. Wczytać wiele ciągów znaków reprezentujących odpowiedzi w ankiecie (wczytywanie zakończy się po otrzymaniu "responses_done")
  3. Utworzyć List do przechowywania wszystkich pierwotnych odpowiedzi (w tym duplikatów)
  4. Użyć Set.from(), aby przekonwertować List na Set, automatycznie usuwając duplikaty
  5. Użyć toList(), aby ponownie przekonwertować Set na List zawierający unikalne odpowiedzi
  6. 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 successfully

Jeś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 successfully

Jeś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 successfully

Twó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
}
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 Dart online