我可以使用each_cons(2).any?哈希值?

时间:2014-10-02 20:49:45

标签: ruby hashmap

如果我有一个整数数组,并希望检查一个值是否小于前一个值。我正在使用:

array = [1,2,3,1,5,7]
con = array.each_cons(2).any? { |x,y| y < x }
p con

返回true,正如预期的那样,1小于3。

如何检查哈希值是否小于先前的哈希值?

hash = {"0"=>"1", "1"=>"2","2"=>"3","4"=>"1","5"=>"5","6"=>"7"}

我还在学习Ruby,所以非常感谢帮助。

2 个答案:

答案 0 :(得分:2)

如果您想了解所有元素是否符合条件,请从数组开始:

array = [1,2,3,1,5,7]
con = array.each_cons(2).all? { |x,y| x < y }
con # => false

更改数组以使元素都小于下一个:

array = [1,2,3,4,5,7]
con = array.each_cons(2).all? { |x,y| x < y }
con # => true

许多方法对于数组元素和哈希的行为类似,因此基本代码是相同的,它们如何传递给块更改。我将哈希值减少到最低限度以演示代码:

hash = {"3"=>"3","4"=>"1","5"=>"5"}
con = hash.each_cons(2).all? { |(_, x_value), (_, y_value) |  x_value < y_value }
con # => false

更改要递增的哈希:

hash = {"3"=>"3","4"=>"4","5"=>"5"}
con = hash.each_cons(2).all? { |(_, x_value), (_, y_value) |  x_value < y_value }
con # => true

使用any?将以相同的方式工作。如果您想知道是否有>=

hash = {"3"=>"3","4"=>"1","5"=>"5"}
con = hash.each_cons(2).any? { |(_, x_value), (_, y_value) |  y_value >= x_value }
con # => true

或者:

hash = {"3"=>"3","4"=>"4","5"=>"5"}
con = hash.each_cons(2).any? { |(_, x_value), (_, y_value) |  x_value >= y_value }
con # => false

  

我通过

创建哈希
stripped = Hash[x.scan(/(\w+): (\w+)/).map { |(first, second)| [first.to_i, second.to_i] }]
  

然后按

删除空数组
new = stripped.delete_if { |elem| elem.flatten.empty? }

这不是使用scan的好方法。考虑这些:

'1: 23'.scan(/\d+/) # => ["1", "23"]
'1: 23'.scan(/(\d+)/) # => [["1"], ["23"]]
'1: 23'.scan(/(\d+): (\d+)/) # => [["1", "23"]]

在第一个中,scan返回一个值数组。在第二个中,它返回一个数组数组,其中每个子数组是一个单独的元素。在第三个中,它返回一个数组数组,其中每个子数组包含两个扫描的元素。您正在使用第三种形式,这会使之后所做的一切变得不必要。

不要使传递给scan的模式复杂化,而是依赖于它能够在查看字符串时返回多个匹配元素并返回其中的数组:

'1: 23'.scan(/\d+/) # => ["1", "23"]

构建于此之上:

'1: 23'.scan(/\d+/).map(&:to_i) # => [1, 23]
Hash[*'1: 23'.scan(/\d+/).map(&:to_i)] # => {1=>23}

请注意*内的前导Hash[]。那&#34; splat&#34;告诉Ruby将数组爆发或爆炸到其组件中。如果不存在会发生什么:

Hash['1: 23'.scan(/\d+/).map(&:to_i)] # => {} # !> this causes ArgumentError in the next release

最后,如果您不需要哈希元素为整数,这与您在问题中提供的哈希相矛盾,请从上面的示例中删除.map(&:to_i)

答案 1 :(得分:0)

首先,将值与散列隔离:

values = hash.map { |key, value| value.to_i } #=> [1, 2, 3, 1, 5, 7]

或:

values = hash.values.map(&:to_i) #=> to_i is a shortcut for:
values = hash.values.map { |value| value.to_i }

然后执行与您的数组示例相同的操作。