当前位置: 首页 > 知识库问答 >
问题:

哈希初始化的Ruby哈希

翟功
2023-03-14

考虑@data是一个带有日期、类、名称和等级字段的Active记录数组。假设我想以两个哈希结束,一个是每个名称的所有日期的唯一集合;另一个按类、日期和名称细分以显示等级。

dates  = {}
grades = {}

@data.each do |d|
   dates[ d.name ][ d.date ] = ''                              # 1
   grades[ d.class => { d.date => { d.name => d.grade } } ]    # 2 
end

>

  • 导致错误:

    nil:NilClass的未定义方法“[]=”

    日期[d.name=

    不会出错,但以空哈希<code>{}</code>结尾

    回到Perl后,我忘记了如何在Ruby中初始化和添加哈希哈希。

    对于第一个(日期),看起来我可以在循环中执行以下操作:

    dates[ d.name ] ||= { d.date => '' }
    dates[ d.name ][ d.date ] = ''
    

    查看文档,我不知道这是否是正确的方法,它似乎效率低下,因为它将为第一个值执行两次赋值。它还建议对于每个键,我需要声明/初始化底层数据结构,哈希的哈希值越深(如等级哈希值)就会变长。

    资料来源:

    [{ name: 'greg', class:'science', date:'jan', grade:'a' },
     { name: 'greg', class:'math'   , date:'jan', grade:'b' },
     { name: 'barb', class:'history', date:'jan', grade:'a' },
     { name: 'barb', class:'science', date:'feb', grade:'c' }]
    

    日期应该是这样的:

    { 'greg' => { 'jan' => '' },
      'barb' => { 'jan' => '' ,
                  'feb' => '' 
                }
    }
    

    分数看起来像:

    { 'science' => { 'jan' => { 'greg' => 'a' } ,
                     'feb' => { 'barb' => 'c' } },
      'math'    => { 'jan' => { 'greg' => 'b' } },
      'history' => { 'jan' => { 'barb' => 'a' } }
    }
    

  • 共有3个答案

    澹台俊达
    2023-03-14

    这实际上是可行的,因为当您试图从散列中访问键时,它不仅返回默认值,而且还设置它:

    Hash.new do |h, k|
      h[k] = Hash.new do |hh, kk|
        hh[kk] = {}
      end
    end
    

    更新:

    这可能更干净一点,尽管对未来的开发人员来说可能比仅仅检查是否为nil更令人困惑。

    dates = Hash.new { |hash, key| hash[key] = {} }
    grades = Hash.new { |hash, key| hash[key] = dates.clone }
    
    黄毅
    2023-03-14

    我能够像这样构建日期哈希:

    arr = [{ name: 'greg', class:'science', date:'jan', grade:'a' },
           { name: 'greg', class:'math'   , date:'jan', grade:'b' },
           { name: 'barb', class:'history', date:'jan', grade:'a' },
           { name: 'barb', class:'science', date:'feb', grade:'c' }]
    
    
    dates = arr.group_by { |x| x[:name] }.each_with_object({}) do |(k, v), hash|
      dates = v.map { |i| i[:date] }.uniq
      dates_hash = dates.each_with_object({}) { |date, h| h[date] = "" }
      hash[k] = dates_hash
    end
    
    puts dates
    
    {"greg"=>{"jan"=>""}, "barb"=>{"jan"=>"", "feb"=>""}}
    
    孙承
    2023-03-14

    尝试使用:

    d={}
    c=Client.first
    d[c.last_name]=[]
    d[c.last_name][c.id]=//your value
    

    d[c .姓氏]=[],初始化c .姓氏的哈希数组

     类似资料:
    • 主要内容:创建哈希,实例,实例,哈希内置方法,实例哈希(Hash)是类似 "key" => "value" 这样的键值对集合。哈希类似于一个数组,只不过它的索引不局限于使用数字。 Hash 的索引(或者叫"键")几乎可以是任何对象。 Hash 虽然和数组类似,但却有一个很重要的区别:Hash 的元素没有特定的顺序。 如果顺序很重要的话就要使用数组了。 创建哈希 与数组一样,有各种不同的方式来创建哈希。您可以通过 new 类方法创建一个空的哈希:

    • 本章节我们学习另外一个可以组合多个的对象类——哈希,了解哈希是什么,如何创建一个哈希以及哈希对象的实例方法。 1. 什么是哈希 哈希是键值对的集合。—— 官方定义 哈希是另一种非常有用且广泛使用的东西,可用于存储其他对象。与仅作为列表的数组不同,哈希表就像字典。我们通过键(key)来查找哈希中的值(value)。好比我们有一个英汉词典,我们通过查找“hello的单词来找到中文意思"你好",此时,“

    • 所以我使用gem文件从reddit的首页拉链接。gem函数返回一个哈希,其中包含首页上的所有链接及其所有信息(评论、业力、作者、日期、链接、上升、下降等的#)。下面是包含我首页上第一个链接信息的哈希请求: {"modhash"= 结尾<code>,</code>分隔下一个链接,如下所示: {“种类”= 我基本上需要某种方法来解析这个散列的每个条目,这样我就可以将所有相关的东西存储到一个数组中。实际

    • 问题内容: 我可以使用一种方法 但是我该如何以user_lib的身份重新找回它? 问题答案: 您想要或: 此处的关键是用作从磁盘加载JSON字符串的一种简单方法,以便可以对其进行解析。或者,如果文件中包含UTF-8数据: 我已经链接到上面的JSON文档,所以您应该阅读它以获取更多详细信息。但总而言之: —在特定对象上创建JSON字符串的方法。 —从对象创建JSON字符串。 —创建一个JSON字符串

    • 我正在尝试使用Sinatra和BCrypt实现一种看似非常简单的身份验证方法,但显然我遗漏了一些东西... 用户会预先分配一个临时密码,该密码以明文形式存储在DB中。 我根据临时口令进行身份验证,然后创建salt和password_hash,并将它们作为字符串写入db(本例中为mongo)。 为了进行身份验证,我从db和用户口令中获取salt进行比较。 bcrypt::Engine.hash_se

    • 问题内容: 当大小超过maxthreshold值时,如何在哈希表或哈希表中进行重新哈希处理? 是否所有对都已复制到新的存储桶阵列中? 编辑: 重新哈希后,同一存储桶(位于链接列表中)中的元素会发生什么情况?我的意思是说,他们在重新哈希处理后会留在同一个桶中吗? 问题答案: 问题中的最大阈值称为负载系数。 建议负载系数约为0.75。负载因子定义为(m / n),其中n是哈希表的总大小,m是在需要增加