簡體   English   中英

在ruby中優雅地處理數據結構(哈希等)

[英]handling data structures (hashes etc) gracefully in ruby

我最近做了一個課堂作業,在那里我制作了一個非常駭人的數據結構。 我最終使用了嵌套的哈希,這似乎是一個好主意,但實際上很難遍歷和管理。

我正在做一般的事情,例如一個標簽映射到一個哈希表,這些哈希表映射到價格和類似的東西。 但是其中一些變得越來越復雜。

我知道Rails使用了很多帶有符號和類似符號的優雅外觀(我從不使用可恥的表情 ),我想知道如何優化它。 例如,如果我的嵌套哈希是這樣的

 h["cool"][????][1.2]

有沒有一種優雅的方法可以將這些價值觀發揮出來? 在這方面,也許我只是一個新手,但是我想在開始做更多事情之前先弄清楚事情。 也許我什至在尋找不同的東西,例如數組/哈希的混合或其他東西。 請告訴我!

看來您需要考慮更嚴格地構造數據。 嘗試為您的商品創建一個類別,其中可能包含其他價格,並可能按照您訪問價格的方式來組織它們。 考慮您想要什么,然后以對您有意義的方式將信息放入結構中。 其他任何事情都是浪費時間,無論是現在還是三個月,當您需要擴展系統卻發現自己做不到的時候。

是的,這將需要很多工作,是的,這是值得的。

編輯:修改以提供該項目的粗略路徑。 但是它不知道變量的名稱。

嘗試這個:

def iterate_nested(array_or_hash, depth = [], &block)
  case array_or_hash
    when Array:
      array_or_hash.each_with_index do |item, key|
        if item.class == Array || item.class == Hash
          iterate_nested(item, depth + [key], &block)
        else
          block.call(key, item, depth + [key])
        end
      end
    when Hash:
      array_or_hash.each do |key, item|
        if item.class == Array || item.class == Hash
          iterate_nested(item, depth + [key], &block)
        else
          block.call(key, item, depth + [key])
        end
      end
  end
end

它應該迭代到任何必要的深度,受內存等的限制,然后返回鍵和項以及返回項的深度。 適用於哈希和數組。

如果您測試:

iterate_nested([[[1,2,3], [1,2,3]], [[1,2,3], [1,2,3]], [[1,2,3], [1,2,3]]]) do |key, item, depth|
  puts "Element: <#{depth.join('/')}/#{key}> = #{item}"
end

它產生:

Element: <0/0/0/0> = 1
Element: <0/0/1/1> = 2
Element: <0/0/2/2> = 3
Element: <0/1/0/0> = 1
Element: <0/1/1/1> = 2
Element: <0/1/2/2> = 3
Element: <1/0/0/0> = 1
Element: <1/0/1/1> = 2
Element: <1/0/2/2> = 3
Element: <1/1/0/0> = 1
Element: <1/1/1/1> = 2
Element: <1/1/2/2> = 3
Element: <2/0/0/0> = 1
Element: <2/0/1/1> = 2
Element: <2/0/2/2> = 3
Element: <2/1/0/0> = 1
Element: <2/1/1/1> = 2
Element: <2/1/2/2> = 3

Cheerio!

h["cool"].keys

然后對樹進行迭代

h["cool"].keys.each |outer| { h["cool"][outer].each { |inner| puts inner }}

這實際上取決於您要嘗試執行的操作(問題中沒有足夠的信息),但是如果您需要將三個或三個以上的層次潛入Hash ,則可能非常需要遞歸樹遍歷算法:

def hash_traverse(hash)
  result = ""
  for key, value in hash
    result << key.to_s + ":\n"
    if !value.kind_of?(Hash)
      result << "  " + value.to_s + "\n"
    else
      result << hash_traverse(value).gsub(/^/, "  ")
    end
  end
  return result
end

您確定Hash是您嘗試執行的最佳數據結構嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM