해시 맵 순회하기
Coddy Rust 여정의 Logic & Flow 섹션에 포함된 레슨 — 66개 중 31번째.
때로는 특정 키를 조회하는 대신 해시 맵의 모든 키-값 쌍을 검사해야 할 때가 있습니다. Rust는 for 루프를 사용하여 모든 데이터를 순회하는 간단한 방법을 제공합니다:
for (key, value) in &my_map {
println!("{}: {}", key, value);
}my_map 앞의 &를 주목하세요. 이것은 해시 맵에 대한 참조를 생성하여 소유권을 가져오지 않고도 반복할 수 있게 해줍니다. 루프는 각 키-값 쌍을 튜플로 제공하며, 루프 선언에서 직접 구조 분해할 수 있습니다.
다음은 가격표를 사용한 실용적인 예제입니다:
let mut prices = HashMap::new();
prices.insert("apple", 1.20);
prices.insert("banana", 0.80);
for (item, price) in &prices {
println!("{} costs ${:.2}", item, price);
}기억해야 할 중요한 세부 사항이 하나 있습니다: 해시 맵은 특정 반복 순서를 보장하지 않습니다. 프로그램을 실행할 때마다 쌍이 다른 순서로 나올 수 있습니다. 이는 해시 맵이 삽입 순서를 유지하는 것보다 빠른 조회를 우선시하기 때문이므로, 반복할 때 항목이 특정 순서로 나타나는 것에 의존하지 마십시오.
챌린지
쉬움처리할 학생-점수 쌍의 개수를 나타내는 정수 n을 입력받습니다. 그런 다음 n개의 입력 쌍(학생 이름과 정수 형태의 시험 점수)을 받습니다. 학생 이름을 키(key)로, 점수를 값(value)으로 저장하는 해시 맵(hash map)을 생성하세요. 모든 쌍을 삽입한 후, 해시 맵을 순회하며 각 학생의 이름과 점수를 출력하세요.
요구 사항:
std::collections에서HashMap을 임포트하세요.HashMap<String, i32>타입을 가진 가변(mutable) 해시 맵을 생성하세요.- 첫 번째 입력을 읽고
i32로 변환하여 쌍의 개수를 가져오세요. - 루프를 사용하여
n개의 입력 쌍(학생 이름, 점수 순서)을 읽으세요. - 각 학생 이름과 점수를 해시 맵에 삽입하세요.
for루프와&map을 사용하여 해시 맵을 순회하세요.- 각 학생의 정보를
[name]: [score]형식으로 출력하세요. - 쌍을 임의의 순서로 출력하세요 (해시 맵은 순서를 보장하지 않습니다).
입력:
- 첫 번째 줄: 정수
n(예:3) - 다음
n개의 줄 쌍:- 학생 이름 (예:
Alice) - 정수 형태의 시험 점수 (예:
95)
- 학생 이름 (예:
출력:
- 각 학생당 한 줄씩
[name]: [score]형식으로 출력 - 출력 줄의 순서는 테스트 실행마다 다를 수 있습니다.
치트 시트
해시 맵의 모든 키-값 쌍을 반복하려면, 맵에 대한 참조와 함께 for 루프를 사용하세요:
for (key, value) in &my_map {
println!("{}: {}", key, value);
}해시 맵 앞의 &는 참조를 생성하여, 소유권을 가져오지 않고도 반복할 수 있게 해줍니다. 루프는 각 키-값 쌍을 튜플로 구조 분해합니다.
해시 맵을 사용한 예시:
let mut prices = HashMap::new();
prices.insert("apple", 1.20);
prices.insert("banana", 0.80);
for (item, price) in &prices {
println!("{} costs ${:.2}", item, price);
}중요: 해시 맵은 특정 반복 순서를 보장하지 않습니다. 해시 맵은 삽입 순서를 유지하는 것보다 빠른 조회를 우선시하기 때문에, 프로그램을 실행할 때마다 쌍이 서로 다른 순서로 나타날 수 있습니다.
직접 해보기
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();
// 학생 이름과 점수를 저장할 가변 해시 맵을 생성합니다
let mut students: HashMap<String, i32> = HashMap::new();
// TODO: 아래에 코드를 작성하세요
// n쌍의 입력(학생 이름과 점수)을 읽고 해시 맵에 삽입합니다
// TODO: 해시 맵을 반복하여 각 학생의 이름과 점수를 출력하세요
}이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.