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}"
endeach_key chỉ duyệt qua các khóa:
prices.each_key { |k| puts k } # apple, bread, milkeach_value chỉ lặp qua các giá trị:
prices.each_value { |v| puts v } # 1, 3, 4Và 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}Thử thách
Trung bìnhBạ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:
- 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ằngeach. 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). Was: $<n>: tổng ban đầu (dùngvalues.sum)Now: $<n>: tổng sau khi giảm giá- 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ùngselectvàkeystrê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
cheeseTự 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
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ý
1Tìm hiểu sâu về chuỗi
Tổng quan về phương thức chuỗiNội suy chuỗiDuyệt qua chuỗiTách và nối chuỗiÔn tập: Đan chuỗi4Khối lệnh, Proc và lambda
Khối lệnh là gì?do..end và dấu ngoặc nhọnTừ khóa yieldTham số của khối lệnhProc và lambdaÔn tập: bộ lặp tùy chỉnh7Hash, phần 2
Hash.new với giá trị mặc địnhLặp qua HashHash lồng nhauGộp và chuyển đổiÔn tập: Bộ đếm tần suất10Dự án: Hồ sơ học sinh
Tổng quan dự ánThêm học sinh2Phạm vi
Phạm vi là gì?Các phương thức của phạm viPhạm vi trong case / whenÔn tập: luyện tập với phạm vi5Sức mạnh của Enumerable
select và rejectNối chuỗi mapreduce / injectcount, all?, any?, none?group_by và partitionsort_by, min_by, max_byÔn tập: quy trình dữ liệuTự luyện tập: Trình biên dịch Ruby online