Menu
Coddy logo textTech

Преобразование списка в множество

Часть раздела Логика и управление потоком путешествия по Dart на Coddy — урок 21 из 65.

Одним из наиболее практичных применений Set является удаление дубликатов из List. Поскольку наборы автоматически исключают дубликаты, вы можете легко преобразовать список с повторяющимися значениями в коллекцию уникальных элементов.

Чтобы преобразовать List в Set, вы просто передаете список в конструктор Set.from(). Это создает новый набор, содержащий все уникальные элементы из исходного списка.

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}

Если вам нужно получить результат обратно в виде List (возможно, для обеспечения совместимости с другими частями вашего кода), вы можете преобразовать набор обратно в список с помощью toList(). Это даст вам список, содержащий только уникальные элементы из оригинала.

List<int> uniqueList = Set.from(numbersWithDuplicates).toList();
print(uniqueList);  // [1, 2, 3, 4, 5]

Этот паттерн List → Set → List чрезвычайно распространен, когда вам нужно очистить данные, удалив дубликаты и сохранив при этом структуру списка для дальнейшей обработки.

challenge icon

Задание

Легко

Создайте программу, которая управляет системой очистки данных, удаляя дубликаты из ответов опроса. Ваша программа должна:

  1. Прочитать строковый ввод, представляющий название опроса
  2. Прочитать несколько строковых вводов, представляющих ответы опроса (ввод закончится, когда вы получите "responses_done")
  3. Создать List для хранения всех исходных ответов (включая дубликаты)
  4. Использовать Set.from() для преобразования списка в Set, что автоматически удалит дубликаты
  5. Использовать toList() для преобразования Set обратно в List уникальных ответов
  6. Вывести результаты очистки данных в точном формате, показанном ниже

Например, если название опроса — "Customer Satisfaction Survey", а ответы — "Excellent", "Good", "Excellent", "Fair", "Good", "Excellent", "Poor", ваша программа должна вывести:

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

Если название опроса — "Product Feedback", а ответы — "Like", "Dislike", "Like", "Like", ваша программа должна вывести:

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

Если название опроса — "Event Rating", а ответы — "Amazing", "Okay", "Great", ваша программа должна вывести:

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

Ваша программа должна демонстрировать полный паттерн List → Set → List. Сначала сохраните все ответы в List, затем используйте Set.from() для создания Set из List, и, наконец, используйте toList() для преобразования Set обратно в List. Рассчитайте количество удаленных дубликатов, вычтя итоговое количество уникальных ответов из исходного общего количества.

Шпаргалка

Чтобы удалить дубликаты из List, преобразуйте его в Set с помощью Set.from():

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}

Чтобы преобразовать Set обратно в List, используйте toList():

List<int> uniqueList = Set.from(numbersWithDuplicates).toList();
print(uniqueList);  // [1, 2, 3, 4, 5]

Паттерн List → Set → List часто используется для очистки данных с сохранением структуры списка.

Попробуйте сами

import 'dart:io';

void main() {
  // Чтение заголовка опроса
  String? surveyTitle = stdin.readLineSync();
  
  // Чтение ответов опроса до тех пор, пока не встретится "responses_done"
  List<String> originalResponses = [];
  String? response;
  while ((response = stdin.readLineSync()) != "responses_done") {
    if (response != null) {
      originalResponses.add(response);
    }
  }
  
  // TODO: Напишите свой код ниже
  // 1. Используйте Set.from() для преобразования списка в Set (удаляет дубликаты)
  // 2. Используйте toList() для преобразования Set обратно в List
  // 3. Рассчитайте количество удаленных дубликатов и итоговое количество
  
  // Вывод результатов в требуемом формате
  print("Survey: $surveyTitle");
  print("Original responses: $originalResponses");
  // Добавьте остальные операторы вывода здесь
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Логика и управление потоком