Hash.new와 기본값
Coddy Ruby 여정의 로직 및 흐름 섹션에 포함된 레슨 — 56개 중 33번째.
기본적으로, 해시에서 존재하지 않는 키를 조회하면 nil을 반환합니다:
scores = {}
puts scores["Alice"] # nilHash.new(default)은 이를 변경합니다. 누락된 모든 키는 전달한 값을 반환합니다:
scores = Hash.new(0)
puts scores["Alice"] # 0이것은 카운터를 작성하는 가장 깔끔한 방법입니다. 값을 증가시키기 전에 if scores[name].nil?을 확인할 필요가 없습니다:
counts = Hash.new(0)
["a", "b", "a", "c", "a"].each do |letter|
counts[letter] += 1
end
puts counts.inspect # {"a"=>3, "b"=>1, "c"=>1}중요: Hash.new(0)은 기본값을 0으로 설정하지만, 키를 읽을 때 해당 키를 저장하지는 않습니다. 해시는 값을 할당하기 전까지 비어 있는 상태를 유지합니다. 따라서 counts[letter] += 1을 작성하면, 키가 새로운 값과 함께 추가됩니다.
챌린지
쉬움쉼표로 구분된 category:amount 항목 목록(예: food:12,gas:30,food:8,books:25,gas:15)을 읽습니다. Hash.new(0)를 사용하여 카테고리별 합계 해시를 생성한 다음, 합계가 최소 20 이상인 카테고리만 합계 기준 내림차순으로 정렬하여 한 줄에 하나씩 출력합니다:
<category>: <total>위의 예시 입력에 대한 출력은 다음과 같습니다:
gas: 45
books: 25
food: 20합계가 20에 도달하는 카테고리가 없으면 아무것도 출력하지 마십시오.
치트 시트
기본적으로, 존재하지 않는 해시 키는 nil을 반환합니다. 대신 다른 기본값을 반환하려면 Hash.new(default)를 사용하세요:
scores = Hash.new(0)
puts scores["Alice"] # 0이 방식은 카운터를 깔끔하게 만들어 줍니다 — 값을 증가시키기 전에 nil 여부를 확인할 필요가 없습니다:
counts = Hash.new(0)
["a", "b", "a"].each do |letter|
counts[letter] += 1
end
# {"a"=>2, "b"=>1}참고: 존재하지 않는 키를 읽는 것만으로는 해당 키가 저장되지 않습니다. 키는 값을 할당할 때만 추가됩니다 (예: +=).
직접 해보기
entries = gets.chomp.split(",")
# TODO: totals = Hash.new(0); 카테고리별 금액 누적;
# 그 다음 합계가 20 이상인 카테고리를 합계 기준 내림차순으로 정렬하여 출력
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.