Menu
CoddyTech

Lặp qua Hash

Thuộc phần Logic và luồng xử lý trong hành trình Ruby của Coddy. Bài học 34 trên 56.

Hash có thể duyệt qua, vì vậy bạn có thể lặp qua chúng giống như mảng. Có ba cách phổ biến, tùy vào điều bạn muốn làm.

each cung cấp cho bạn cả khóa lẫn giá trị:

prices = { apple: 1, bread: 3, milk: 4 }
prices.each do |item, price|
  puts "#{item}: $#{price}"
end

each_key chỉ duyệt qua các khóa:

prices.each_key { |k| puts k }   # apple, bread, milk

each_value chỉ lặp qua các giá trị:

prices.each_value { |v| puts v }   # 1, 3, 4

Và mọi phương thức Enumerable mà bạn đã thấy ở chương trước, map, select, reduce, đều hoạt động với hash. Mỗi lần lặp, bạn nhận được một cặp khóa/giá trị (hoặc một mảng gồm 2 phần tử):

prices.select { |item, price| price > 2 }
# {bread: 3, milk: 4}
challenge icon

Thử thách

Trung bình

Bạn đang áp dụng chương trình giảm giá cho một danh sách giá. Hash prices đã cho (ký hiệu mặt hàng => giá dạng số nguyên).

Đọc một dòng đầu vào: danh sách các mặt hàng được giảm giá 50%, phân tách bằng dấu phẩy (đối chiếu theo tên với các ký hiệu trong hash).

In ra theo thứ tự sau:

  1. Mỗi mặt hàng một dòng theo định dạng <item>: $<final_price>, trong đó giá cuối cùng là giá đã giảm nếu mặt hàng nằm trong danh sách giảm giá, nếu không thì là giá ban đầu. Duyệt bằng each. Các mặt hàng giữ nguyên thứ tự ban đầu. Dùng phép chia số nguyên để tính mức giảm (price / 2).
  2. Was: $<n>: tổng ban đầu (dùng values.sum)
  3. Now: $<n>: tổng sau khi giảm giá
  4. Tên các mặt hàng có giá cuối cùng vẫn lớn hơn 2, nối với nhau bằng , (dùng select và keys trên hash mới)

Với đầu vào bread,milk và hash mặc định, đầu ra là:

apple: $1
bread: $1
milk: $2
cheese: $6
Was: $14
Now: $10
cheese

Tự làm thử

prices = { apple: 1, bread: 3, milk: 4, cheese: 6 }
discount = gets.chomp.split(",").map(&:to_sym)

# TODO: tạo hash giá cuối cùng bằng each; in ra (print) từng dòng, tổng tiền và các mặt hàng đắt tiền
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Logic và luồng xử lý

Tự luyện tập: Trình biên dịch Ruby online