如何在Ruby中按位置获取哈希值?

7

我想通过位置获取哈希值,就像数组一样。

例如: h = Hash["a" => 100, "b" => 200]

在这个数组中,当我们调用h [0]时,它会返回给定数组中的第一个元素。

哈希表中是否也可以实现相同的功能?如果可以,那么如何实现?

谢谢, Prasad。


1
在Ruby中,哈希和顺序不太搭配,所以最好使用数组代替。 - oldergod
6个回答

11

如上所述,根据您的使用情况,您可以使用以下方式实现:

  h.keys[0]
  h.values[0]
  h.to_a[0]

自Ruby 1.9.1起,Hash会保留插入顺序。如果您需要与Ruby 1.8兼容,则ActiveSupport::OrderedHash是一个不错的选择。


5

实际上,哈希中的位置是没有明确定义的,因为按定义它是一个无序集合。但是,如果您坚持想要这样做,您可以将哈希转换为数组,然后按照您已知的方式进行操作:

irb(main):001:0> h = {:a => 1, :b => 2}
=> {:b=>2, :a=>1}
irb(main):002:0> h.to_a
=> [[:b, 2], [:a, 1]]

2
你可以扩展哈希(ruby 1.9.x)以获得所需内容,具体步骤如下:
class Hash
  def last                # first is already defined
    idx = self.keys.last
    [idx , self[idx]]
  end
  def array_index_of(n)   # returns nth data
    idx = self.keys[n]
    self[idx]
  end
end

h = {"a" => 100, "b" => 200}
h.first # ["a", 100]
h.last  # ["b", 200]

h.array_index_of(0) # => 100
h.array_index_of(1) # => 200

1

就像这样简单:

h.values[0]
# or
h.keys[0]

但元素的顺序是未定义的,也许它们不是您想要获取的顺序。


0

你只能通过键获取元素。哈希是一种没有顺序的结构,就像集合一样。


自从 Ruby 1.9.3 以后,不再是真的。 - mykola

0

哈希值只能通过键访问,如其他答案所述。哈希中不支持数组的索引属性。如果您想在Ruby中使用有序哈希,可以使用ActiveSupport::OrderedHash,但我认为您并不需要这个功能。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接