ruby中的数据结构只存储独特的元素?

时间:2012-01-05 15:38:51

标签: ruby data-structures set

我想在Ruby中使用一个数据结构,它只会存储一次字符串,并在下次尝试将其放入时拒绝它(类似于'SET')。 实现需要最有效(例如,比数组中的线性搜索更好)。

此外,我尝试使用Hash,但是具有相同值的多个字符串(我从一些现有字符串的切片操作获得的这些字符串)进入Hash,似乎正在计算它们的不同哈希值。

什么是最好和最有效的出路?我不想使用红宝石宝石。我正在研究一个在线评判的拼图解决方案,我只能提交自己的代码。

以下是我写的代码段:

for string in @string_store do
  for c in 0...string.length
    index_to_sum=0
    while c+index_to_sum<string.length do
      substring=string[c..(c+index_to_sum)]         
      unless @hash_store[substring]=='X'
        @hash_store[substring]='X'
      end
      index_to_sum+=1
    end
  end
end   

2 个答案:

答案 0 :(得分:6)

Ruby Set:)

怎么样?
require 'set'
s1 = Set.new [1, 2]                   # -> #<Set: {1, 2}>
s2 = [1, 2].to_set                    # -> #<Set: {1, 2}>
s1 == s2                              # -> true
s1.add("foo")                         # -> #<Set: {1, 2, "foo"}>
s1.merge([2, 6])                      # -> #<Set: {6, 1, 2, "foo"}>
s1.subset? s2                         # -> false
s2.subset? s1                         # -> true

虽然它使用require,但Ruby Set是Ruby标准库的一部分,所以它应该完全可以接受代码提交

答案 1 :(得分:0)

当然macek的解决方案有效,但Hash肯定也能正常工作。使用Hash存储唯一列表是语言中常见的习惯用语,它们没有对集合的本机支持。你能提供一个小代码示例,用重复的字符串重现问题吗?我怀疑当你转换为使用一个集合时,你可能会遇到同样的问题。