Menu
Coddy logo textTech

Обновление значения

Часть раздела Logic & Flow путешествия по Rust на Coddy — урок 32 из 66.

Иногда вам нужно обновлять значения в хеш-карте различными способами. Вы уже узнали, что .insert() перезапишет существующее значение, но что, если вы хотите добавить значение только в том случае, если ключ еще не существует?

Rust предоставляет API .entry() для более сложных обновлений значений. Самым полезным методом в этом API является .or_insert(), который вставляет значение только в том случае, если ключ еще не представлен:

let mut scores = HashMap::new();
scores.insert("Alice", 85);

// Это НЕ перезапишет значение для Alice
scores.entry("Alice").or_insert(90);

// Это ДОБАВИТ значение для Bob, так как его нет в хеш-таблице
scores.entry("Bob").or_insert(90);

Метод .entry() возвращает перечисление Entry, которое представляет собой либо занятое, либо свободное место в хеш-карте. Когда вы вызываете на нем .or_insert(), он вставляет новое значение только в том случае, если запись пуста (ключ не существует).

challenge icon

Задание

Легко

Вы получите целое число n, указывающее количество имен игроков для обработки. Затем вы получите n имен игроков в качестве входных данных. Создайте хеш-карту для отслеживания очков игроков (тип HashMap<String, i32>). Для каждого полученного имени игрока используйте .entry() с .or_insert(), чтобы добавить их в карту с начальным счетом 100 только в том случае, если они еще не существуют. После обработки всех имен выведите каждого игрока и его счет.

Требования:

  • Импортируйте HashMap из std::collections
  • Создайте изменяемую хеш-карту с типами HashMap<String, i32>
  • Прочитайте первый ввод и преобразуйте его в i32, чтобы получить количество имен игроков
  • Используйте цикл для чтения n имен игроков
  • Для каждого имени игрока используйте .entry(name).or_insert(100), чтобы добавить их со счетом 100, если их еще нет в карте
  • После обработки всех имен переберите хеш-карту и выведите информацию о каждом игроке в формате: [name]: [score]

Ввод:

  • Первая строка: Целое число n (например, 5)
  • Следующие n строк: Имена игроков (например, Alice, Bob, Alice, Charlie, Bob)

Вывод:

  • Одна строка для каждого уникального игрока в формате: [name]: [score]
  • Порядок строк вывода может меняться от запуска к запуску

Шпаргалка

API .entry() предоставляет продвинутые способы обновления значений в хэш-карте. Метод .or_insert() вставляет значение только в том случае, если ключ еще не существует:

let mut scores = HashMap::new();
scores.insert("Alice", 85);

// Это НЕ перезапишет результат Alice
scores.entry("Alice").or_insert(90);

// Это ДОБАВИТ результат Bob, так как его нет в карте
scores.entry("Bob").or_insert(90);

Метод .entry() возвращает перечисление Entry, представляющее либо занятое, либо свободное место в хэш-карте. Когда вы вызываете .or_insert(), он вставляет новое значение только в том случае, если запись свободна (ключ не существует).

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

use std::collections::HashMap;
use std::io::{self, BufRead};

fn main() {
    let stdin = io::stdin();
    let mut lines = stdin.lock().lines();
    
    // Прочитать количество имен игроков
    let n: i32 = lines.next().unwrap().unwrap().trim().parse().unwrap();
    
    // Создать изменяемый HashMap для хранения очков игроков
    let mut player_scores: HashMap<String, i32> = HashMap::new();
    
    // TODO: Напишите ваш код ниже
    // Прочитайте n имен игроков и используйте .entry().or_insert(100), чтобы добавить их в карту
    
    
    
    // Вывести каждого игрока и его очки в формате: [имя]: [очки]
    
}
quiz iconПроверьте себя

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

Все уроки раздела Logic & Flow