【问题标题】:Ruby 1.9: turn these 4 arrays into hash of key/value pairsRuby 1.9:将这 4 个数组转换为键/值对的散列
【发布时间】:2010-05-06 21:25:28
【问题描述】:

我有四个来自客户端的数组。假设有一系列名称、出生日期、最喜欢的颜色和位置。我的想法是稍后我想要一个散列,其中每个名称都有一个具有各自属性的散列:

来自客户的示例日期:

[name0, name1, name2, name3]
[loc0, loc1]
[favcololor0, favcolor1]
[bd0, bd1, bd2, bd3, bd4, bd5]

我想实现的输出:

name0 => { location => loc0, favcolor => favcolor0, bd => bd0 }
name1 => { location => loc1, favcolor => favcolor1, bd => bd1 }
name2 => { location => nil, favcolor => nil, bd => bd2 }
name3 => { location => nil, favcolor => nil, bd => bd3 }

我想在一天结束时有一个数组,我可以在其中迭代和处理每个特定的人哈希。

每个数组中的值不必相等。意思是,名字是必需的。我可能会收到其中的 5 个,但我可能只会收到 3 个出生日期、2 个最喜欢的颜色和 1 个位置。每个缺失值都将导致零。

如何使用 Ruby 1.9 制作这种数据结构?

【问题讨论】:

  • 如果你有5个名字和2个颜色,你怎么知道哪些颜色属于哪些名字?
  • 第 0 行中的所有内容都属于一个哈希,第一个元素位置中的所有内容都属于一起并向前。任何缺失值都会导致零。这可能是 zip 和其他一些花哨的 ruby​​ 数组方法的工作。

标签: ruby


【解决方案1】:

我可能会这样做

# assuming names, fav_colors, birth_dates, and locations are your arrays

name_collection = {}

names.zip(birth_dates, fav_colors, locations) do |name, birth_date, fav_color, location|
  name_collection[name] = { :birth_date => birth_date,
                            :fav_color => fav_color,
                            :location => location }
end

# usage
puts name_collection['jack'][:fav_color] # => 'blue'

【讨论】:

    【解决方案2】:

    代表一个人的小类

    class Person
      attr_accessor :name, :color, :loc, :bd
    
      def initialize(args = {})
        @name = args[:name]
        @color = args[:color]
        @loc = args[:loc]
        @bd = args[:bd]
      end
    
      def pp()
        puts "*********"
        puts "Name: #{@name}"
        puts "Location: #{@loc}"
        puts "Birthday: #{@bd}"
        puts "Fav. Color: #{@color}"
        puts "*********"
      end
    end
    

    另一个代表人,主要只是一个Persons的列表。

    class People
      attr_accessor :list_of_people
    
      def initialize()
        @list_of_people = {}
      end
    
      def load_people(names, locations, favcolors, birthdates)
        names.each_with_index do |name, index|
          @list_of_people[name] = Person.new(:name => name, :color => favcolors[index], :loc => locations[index], :bd => birthdates[index])
        end
      end
    
      def pp()
        @list_of_people.each_pair do |key, value|
          value.pp()
        end
    
      end
    end
    

    我为每个都添加了一个漂亮的打印功能,这样你就可以看到他们的数据。有了这样的起点,修改和添加执行各种有用事情的方法将非常容易。

    if __FILE__ == $0
      names = ["name0", "name1", "name2", "name3"]
      locs = ["loc0","loc1"]
      favcolors = ["favcolor0", "favcolor1"]
      bds = ["bd0","bd1","bd2","bd3","bd4"]
    
      a = People.new()
      a.load_people(names,locs,favcolors,bds)
      a.pp()
    end
    

    【讨论】:

      【解决方案3】:

      我认为您正在寻找的数据结构类型是 -ahem- 结构。

          # setup data
          names = %w(name0 name1 name2 name3)
          locations = %w(loc0 loc1)
          colors = %w(favcololor0 favcolor1)
          bd = %w(bd0 bd1 bd2 bd3 bd4 bd5)
      
          # let's go
          Person = Struct.new( :name, :location, :fav_color, :bd )
          all_persons = names.zip( locations, colors, bd ).map{|p| Person.new( *p)}
          # done
      
          puts all_persons
          someone= all_persons.find{|p| p.name == "name1"}
          puts someone.location unless someone.nil?
      

      【讨论】:

        猜你喜欢
        • 2014-07-03
        • 2017-01-18
        • 2015-06-12
        • 2015-07-01
        • 2015-01-21
        • 2012-07-01
        • 2023-03-07
        • 2018-02-10
        • 1970-01-01
        相关资源
        最近更新 更多