This page is READ-ONLY. It is generated from the old site.
All timestamps are relative to 2013 (when this page is generated).
If you are looking for TeX support, please go to VietTUG.org

Sắp xếp mảng của các hash

it's easy
Added by about 3 years ago

Trong Ruby, phân biệt là kiểu mảng ArrayHash (không biết dịch là gì). Kiểu Hash giống với kiểu tự điển trong Python, và cũng giống với kiểu mảng với chỉ số tùy ý trong PHP. Ví dụ

  1. Mảng: t_array = [1,2,3, "a", "b", :c]
  2. Hash: t_hash = {:name => "Anh", :age => 32, :job => "it"}

Trong PHP, khai báo tương ứng là $t_hash = Array("name" => "Anh", "age" => 32, "job" => "it"). Thật sự thì không thể bê nguyên từ Ruby qua PHP mọi khai báo dạng như vậy, vì chỉ số trong Ruby có thể là một symbol hoặc một chuỗi (trong ví dụ ở trên, ta dùng toàn symbol).

Bây giờ, giả sử ta có một mảng của các hash. Ví dụ, t_hash ở trên mô tả một người, và ta có nhiều hơn một người như vậy. Sau đây là mảng gồm ba hash, mỗi hash mô tả một người với các thông tin về tên, tuổi và nghề nghiệp.

t_hashes = [ {:name => "Anh", :age => 32, :job => "it"}, \
             {:name => "Nam", :age => 23, :job => "ti"}, \
             {:name => "Han", :age => 22, :job => "tt"} ]

Vấn đề đặt ra là ta cần sắp xếp mảng trên, theo "tuổi" của những thành viên có trong mảng. Trong PHP, ta phải định nghĩa một hành để sắp xếp riêng, sau đó thực hiện sắp xếp theo hàm này (phải nhấn mạnh rằng, ta phải định nghĩa riêng một hàm để sắp xếp). Với Ruby thì mọi việc gọn nhẹ hơn như sau đây:

t_hashes_sorted = t_hash.sort {|a,b| a[:age] <=> b[:age]}

Có điều gì bí mật hay khó hiểu gì ở đây không? Trong biểu thức trên, |a,b| đại diện cho một cặp hai phần tử sẽ được so sánh với nhau. Trong trường hợp của ta, mỗi phần tử a, b là một hash, và do đó nó chấp nhận thuộc tính [:age] để lấy ra tuổi. Cuối cùng, ký hiệu là một phép so sánh đặc biệt: theo nghĩa, nếu x thì x y trả về -1, nếu x == y thì trả về 0, và khi x > y thì trả về 1.

Tất nhiên, có rất nhiều vấn đề khác liên quan tới việc so sánh

  1. So sánh bằng thuật toán riêng (không theo thuật toán có sẵn trong Ruby)
  2. So sánh các chuỗi ký tự tiếng Việt
  3. Ngẫu nhiên hóa (xáo trộn) một mảng

Trong bài tới, có thể là một chút về sắp xếp hash của các hash, với một chút ngoại lệ khá hay và có thể gây nhầm lẫn khi lập trình.


Comments