Ruby:基于范围

时间:2016-12-15 19:50:32

标签: ruby search

例如,如果我有以下情况

如果键的范围是1-4,则选择A. 如果key的范围是5-6,则选择B.

我在Java中使用各种数据结构找到了几个答案。建议的数据结构是skiplist / tree,tree-map,linkedlist等。

是否有任何ruby实现?或者我如何在Ruby中解决这个问题?

2 个答案:

答案 0 :(得分:0)

这是一个可以达到这个目的的课程:

class RangedKeyHash < Hash
  def [](key)
    case key
    when 1..4
      super("A")
    when 5..6
      super("B")
    else
      raise KeyError, "#{key} not valid"
    end
  end
end

测试:

hash = RangedKeyHash.new
hash["A"] = "value for A"
hash["B"] = "value for B"
hash[2]
# => "value for A"
hash[5]
# => "value for B"
hash[100]
# => KeyError

这不是一个容易想到的用例,但它至少是可能的。

答案 1 :(得分:0)

这应该有效:

class RangedHash
  def initialize(hash)
    @hash = hash.to_hash
  end

  def [](key)
    @hash.find do |k, v|
      break v if k.respond_to?(:include?) && k.include?(key) || k == v
    end
  end
end

用法:

hash = RangedHash.new(1..4 => 'A', 5..6 => 'B')

hash[2] => "A"    
hash[5] => "B"  
hash[7] => nil