2016-12-15 131 views
0

例如,如果我有以下情形红宝石:基于范围

如果key范围1-4,然后选择A. 如果关键是范围从5-6的数据结构键查找然后选择B.

我在Java中发现了几个使用各种数据结构的答案。建议的数据结构是skiplist/tree,树形图,链表等。

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

+0

您可以使用[?范围#包括(http://ruby-doc.org/core-2.3.3/Range .html#method-i-include-3F) –

+0

我想用范围指向的范围传递给范围。 – LOCKLOCK

回答

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 

这里没有,很容易想到一个用例,但它有可能至少。

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 
+0

我喜欢这个。但是,运行时仍然是o(n)。想知道是否有o(logn)解决方案。 – LOCKLOCK

+0

我不知道有,哈希查找基于对象的平等我相信,所以你不能只是试图比较一个数字与范围,并期望它的工作。 – Rorshark

+0

以下是我在这个主题上发现的一个讨论(ahem!google):https://www.ruby-forum.com/topic/148494 – Rorshark