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. Рассчитайте количество удаленных дубликатов, вычтя итоговое количество уникальных ответов из исходного общего количества.

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

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Проверьте себя

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

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

Потренируйтесь самостоятельно: Онлайн-компилятор Dart