Условное добавление: putIfAbsent
Часть раздела Логика и управление потоком путешествия по Dart на Coddy — урок 29 из 65.
Иногда вам нужно добавить пару ключ-значение в Map, но только если этот ключ еще не существует. Метод putIfAbsent() идеально справляется с этой ситуацией, добавляя запись только в том случае, если ключ отсутствует в карте.
Этот метод принимает два параметра: ключ для проверки и значение, которое нужно добавить, если ключ отсутствует. Если ключ уже существует, putIfAbsent() ничего не делает и оставляет существующее значение без изменений. Если ключ отсутствует, он добавляет новую пару «ключ-значение» в карту.
Map<String, int> gameScores = {
'Alice': 150,
'Bob': 200
};
// Это добавит Charlie, так как его нет в объекте Map
gameScores.putIfAbsent('Charlie', () => 0);
print(gameScores); // {Alice: 150, Bob: 200, Charlie: 0}
// Это не изменит счет Alice, так как она уже существует
gameScores.putIfAbsent('Alice', () => 0);
print(gameScores); // {Alice: 150, Bob: 200, Charlie: 0}Метод putIfAbsent() особенно полезен для инициализации значений по умолчанию, таких как создание новых учетных записей пользователей или обеспечения существования определенных ключей перед выполнением операций над ними. Это безопасный способ добавления данных без случайной перезаписи существующей информации.
Задание
ЛегкоСоздайте программу, которая управляет системой регистрации на игровой турнир, отслеживая очки игроков и обеспечивая наличие у всех игроков начальных значений по умолчанию. Ваша программа должна:
- Прочитать строковый ввод, представляющий название турнира
- Прочитать несколько пар входных данных, представляющих имена игроков и их текущие очки (ввод закончится, когда вы получите
"scores_done") - Прочитать несколько строковых вводов, представляющих новых игроков, которые хотят присоединиться к турниру (ввод закончится, когда вы получите
"players_done") - Создать Map для хранения имен игроков в качестве ключей и их очков в качестве значений
- Использовать метод
putIfAbsent()для добавления каждого нового игрока с очками по умолчанию 0, но только если они еще не зарегистрированы - Рассчитать статистику турнира и вывести отчет о регистрации в точном формате, показанном ниже
Например, если название турнира — "Spring Championship", существующие очки включают "Alice" с 150, "Bob" с 200, "Charlie" с 75, а новые игроки — "Diana", "Alice", "Eve", ваша программа должна вывести:
Tournament: Spring Championship
Initial Scores: {Alice: 150, Bob: 200, Charlie: 75}
Registration Process:
Adding Diana: New player registered with score 0
Adding Alice: Player already exists, keeping score 150
Adding Eve: New player registered with score 0
Final Scores: {Alice: 150, Bob: 200, Charlie: 75, Diana: 0, Eve: 0}
Tournament Statistics:
Total registered players: 5
Players with scores above 0: 3
New players added: 2
Average score: 85.0
Status: Registration completed successfullyЕсли название турнира — "Winter Cup", существующие очки включают "John" с 300, "Mary" с 250, а новые игроки — "Sarah", "Tom", "John", ваша программа должна вывести:
Tournament: Winter Cup
Initial Scores: {John: 300, Mary: 250}
Registration Process:
Adding Sarah: New player registered with score 0
Adding Tom: New player registered with score 0
Adding John: Player already exists, keeping score 300
Final Scores: {John: 300, Mary: 250, Sarah: 0, Tom: 0}
Tournament Statistics:
Total registered players: 4
Players with scores above 0: 2
New players added: 2
Average score: 137.5
Status: Registration completed successfullyЕсли название турнира — "Summer League", существующие очки включают "Alex" с 180, "Jordan" с 220, "Taylor" с 160, "Morgan" с 190, а новые игроки — "Casey", "Riley", ваша программа должна вывести:
Tournament: Summer League
Initial Scores: {Alex: 180, Jordan: 220, Taylor: 160, Morgan: 190}
Registration Process:
Adding Casey: New player registered with score 0
Adding Riley: New player registered with score 0
Final Scores: {Alex: 180, Jordan: 220, Taylor: 160, Morgan: 190, Casey: 0, Riley: 0}
Tournament Statistics:
Total registered players: 6
Players with scores above 0: 4
New players added: 2
Average score: 158.33333333333334
Status: Registration completed successfullyВаша программа должна использовать метод putIfAbsent() для добавления новых игроков с очками по умолчанию 0, гарантируя, что у существующих игроков их текущие очки останутся без изменений. Рассчитайте средний балл, разделив сумму всех очков на количество игроков. Подсчитайте, сколько игроков имеют очки выше 0 и сколько новых игроков было фактически добавлено (исключая тех, кто уже был зарегистрирован). Формат ввода будет следующим: название турнира, затем чередующиеся имена игроков и очки (в виде строк, которые необходимо преобразовать в целые числа), заканчивающиеся на "scores_done", после чего следуют имена новых игроков, заканчивающиеся на "players_done".
Шпаргалка
Метод putIfAbsent() добавляет пару ключ-значение в Map только в том случае, если ключ еще не существует:
Map<String, int> gameScores = {
'Alice': 150,
'Bob': 200
};
// Добавляет Charlie, так как его нет в карте
gameScores.putIfAbsent('Charlie', () => 0);
// Не изменит счет Alice, так как она уже существует
gameScores.putIfAbsent('Alice', () => 0);Этот метод полезен для инициализации значений по умолчанию без перезаписи существующих данных.
Попробуйте сами
import 'dart:io';
void main() {
// Чтение названия турнира
String? tournamentName = stdin.readLineSync();
// Создание карты для хранения очков игроков
Map<String, int> playerScores = {};
// Чтение существующих очков игроков
while (true) {
String? input = stdin.readLineSync();
if (input == "scores_done") break;
String playerName = input!;
String? scoreInput = stdin.readLineSync();
int score = int.parse(scoreInput!);
playerScores[playerName] = score;
}
// Сохранение начальных очков для отображения
Map<String, int> initialScores = Map.from(playerScores);
// Чтение новых игроков для регистрации
List<String> newPlayers = [];
while (true) {
String? input = stdin.readLineSync();
if (input == "players_done") break;
newPlayers.add(input!);
}
// TODO: Напишите свой код ниже
// Используйте метод putIfAbsent() для добавления новых игроков с начальным счетом 0
// Отслеживайте процесс регистрации и рассчитывайте статистику
// Вывод отчета о регистрации на турнир
print("Tournament: $tournamentName");
print("Initial Scores: $initialScores");
print("Registration Process:");
// Выведите детали процесса регистрации здесь
print("Final Scores: $playerScores");
print("Tournament Statistics:");
// Выведите статистику здесь
print("Status: Registration completed successfully");
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Продвинутая работа со списками
Свойства списка: first и lastСостояние списка: isEmpty и isNotEmptyРазворот спискаДобавление в список: insertУдаление из списка: removeWhereПоиск в списке: indexOfСортировка спискаПеремешивание спискаИтоги — Органайзер списков4Продвинутая работа с Map
Итерация по MapПроверка ключей и значенийСвойства Map: keys и valuesУсловное добавление: putIfAbsentУдаление записей из MapВложенные MapИтоги — Обновление инвентаря2Функциональные операции со списками
Преобразование с помощью 'map'Фильтрация с помощью 'where'Использование '.toList()'Проверка условий с помощью 'any'Условия с 'every'Поиск с помощью 'firstWhere'Повторение — фильтрация данных5Проект: Калькулятор корзины
Настройка проектаДобавление товаров в корзину3Множества
Что такое множество?Создание множестваДобавление и удаление элементовПроверка наличия элементов в множествеПреобразование списка в множествоОбъединение множествПересечение множествРазность множествИтоги: уникальный список гостей