Duyệt qua mảng 2 chiều
Thuộc phần Logic và luồng xử lý trong hành trình Ruby của Coddy. Bài học 12 trên 56.
Để duyệt qua mọi ô trong mảng 2D, bạn lồng hai lần lặp. Vòng lặp bên ngoài duyệt qua các hàng, vòng lặp bên trong duyệt qua các cột của hàng đó.
Mẫu Ruby tự nhiên nhất dùng each hai lần:
grid = [
[1, 2, 3],
[4, 5, 6]
]
grid.each do |row|
row.each do |cell|
puts cell
end
end
# 1, 2, 3, 4, 5, 6 (mỗi số trên một dòng riêng)Nếu bạn cũng cần chỉ số hàng và cột, chẳng hạn để gắn nhãn cho từng ô, hãy dùng each_with_index ở cả hai cấp:
grid.each_with_index do |row, r|
row.each_with_index do |cell, c|
puts "(#{r},#{c}) = #{cell}"
end
endCách viết này ngắn gọn và an toàn hơn so với tự theo dõi chỉ số, bạn sẽ không có nguy cơ vượt quá phần tử cuối cùng của một hàng.
Thử thách
DễCho sẵn mảng 2D grid (3 hàng × 3 cột gồm các số nguyên).
Với mỗi hàng, hãy tìm mọi ô có giá trị lớn hơn hẳn giá trị trung bình của hàng đó. In mỗi ô như vậy trên một dòng riêng theo định dạng:
(r,c) = valueDùng các vòng lặp lồng nhau với each_with_index. Tính giá trị trung bình bên trong vòng lặp ngoài để ngưỡng của mỗi hàng độc lập với nhau.
Với mảng mặc định, các ô có giá trị lớn hơn giá trị trung bình của hàng là:
(0,1) = 8
(1,2) = 9
(2,0) = 6
(2,1) = 7Tự làm thử
grid = [
[1, 8, 3],
[4, 5, 9],
[6, 7, 2]
]
# TODO: dùng each_with_index lồng nhau, in ra các ô có giá trị lớn hơn giá trị trung bình của hàng
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ệu3Mảng 2 chiều
Kiến thức cơ bản về mảng 2 chiềuTruy cập phần tử trong mảng 2 chiềuDuyệt qua mảng 2 chiềuCác mẫu phổ biến với mảng 2 chiềuÔn tập: thao tác với ma trận6Dự án: Trình quản lý thư viện
Tổng quan dự ánThêm sáchTự luyện tập: Trình biên dịch Ruby online