迭代特定范围的哈希表

6
如何在哈希中传递范围以迭代从索引1到最后一个?
h = {}

h[1..-1].each_pair do |key,value|
  puts "#{key} = #{value}
end

这段代码返回错误。我该如何在哈希中传递范围?

编辑:

我想要打印第一个键和值,没有任何计算。

从第二个键和值开始,我想对我的哈希进行一些计算。

为此,我编写了以下代码... 存储包含键和值的内容到哈希表中。

first_key_value = store_content_in_hash.shift
f.puts first_key_value[1]
f.puts
store_content_in_hash.each_pair do |key,value|
  store_content_in_hash[key].sort.each {|v| f.puts v }
  f.puts
end

有没有更好的方法来解决这个问题?

你想要实现什么?也许你只需要一个算法,可以生成一些哈希值(这基本上是一个数学函数),给定某个值。因此,对于一个字符串,例如你可以将所有ASCII值*字符串中的位置%质数相加。 - James Black
4个回答

8
在 Ruby 1.9 中:
给定一个哈希:
h = { :a => :b, :c => :d, :e => :f }

像这样使用 Go:

Hash[Array(h)[1..-1]].each_pair do |key, value|
    # ...
end

这将遍历以下哈希表{:c => :d, :e => f},因为范围排除了第一个键/值对。

不错的回答。对于任何给定的范围,我们可以执行Hash[Array(h)[0, 5]],获取前5条记录/元素。这在进行分页时非常有用。 - Abhi

2

哈希表没有顺序概念,其中没有所谓的第一个或第二个元素。

因此,您无法在哈希表中实现您想要的功能。


1

Hash 不涉及范围,而是关于键值对。在 Ruby 1.8 中,哈希是无序的,因此您无法确定键和值的迭代顺序,使得“范围”过时了。我相信您在这种情况下做错了一些事情。您能详细说明一下您的问题吗?

另外,您之所以会收到错误消息,是因为哈希实例中的方括号接受键作为参数。因此,如果您的哈希不包含 1..-1 作为键,则会得到 nil 值,而 nil 不能响应 each_pair。尝试使用以下方法来解决这个问题:

h = {(1..-1) => {:foo => :bar}}

h[1..-1].each_pair do |key,value| 
  puts "#{key} = #{value}"
end

0

正如其他人所指出的,哈希表并不关注顺序。虽然1.9版本的哈希表是有序的,但这只是一种方便,而不是它们的主要特点。

如果顺序对你很重要,那么就使用数组代替哈希表。在你的情况下,一组成对的数组(两个元素的数组)似乎符合目的。如果需要通过键访问它,你可以随时使用Hash#[]方法将其轻松转换为哈希表。


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