Tôi cần một bảng Hash hai chiều trong Ruby. Ví dụ:Bảng băm hai chiều trong Ruby
h = {:abc => 123, :xyz => 789, :qaz => 789, :wsx => [888, 999]}
h.fetch(:xyz) # => 789
h.rfetch(123) # => abc
h.rfetch(789) # => [:xyz, :qaz]
h.rfetch(888) # => :wsx
Phương pháp rfetch
nghĩa đảo ngược lấy và duy nhất là đề nghị của tôi.
Lưu ý ba điều:
- Nếu bản đồ nhiều phím ở cùng giá trị sau đó
rfetch
trả về tất cả trong số họ, đóng gói trong mảng. - Nếu giá trị là một mảng thì
rfetch
tìm kiếm thông số của nó trong số các phần tử của mảng. - Hash hai chiều có nghĩa là cả hai
fetch
vàrfetch
sẽ được thực thi trong thời gian không đổi.
Cấu trúc này có tồn tại trong Ruby (bao gồm thư viện bên ngoài) không?
Tôi đã nghĩ đến việc triển khai nó bằng cách sử dụng hai Hashes một chiều được đồng bộ hóa khi một trong số chúng được sửa đổi (và đóng gói nó vào lớp để tránh các vấn đề đồng bộ hóa).
Để nhanh chóng và bẩn, bạn có thể sử dụng 'hash.invert()' được xây dựng sẵn để tạo một băm nghịch đảo riêng biệt (http://stackoverflow.com/a/3794060/18706). Như @ ken-bloom chỉ ra, một triển khai mạnh mẽ hơn về điều này là tại http://raa.ruby-lang.org/project/inverthash/ – mahemoff