Ruby 1.9: превратить эти 4 массива в хэш пар ключ / значение - PullRequest
1 голос
/ 06 мая 2010

У меня есть четыре массива, которые приходят от клиента. Допустим, есть множество имен, дат рождения, любимого цвета и местоположения. Идея в том, что я хочу хэш позже, где каждое имя будет иметь хэш с соответствующими атрибутами:

Пример даты, получаемой от клиента:

[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?

Ответы [ 3 ]

2 голосов
/ 06 мая 2010

Я бы, наверное, сделал это так

# 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'
0 голосов
/ 06 мая 2010

Я думаю, что структура данных, которую вы ищете, это -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?
0 голосов
/ 06 мая 2010

Небольшой класс для представления личности

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

другой класс для представления людей, в основном это просто список людей.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...