2010-05-06 6 views
1

J'ai quatre tableaux qui arrivent du client. Disons qu'il y a un tableau de noms, dates de naissance, couleur préférée et emplacement. L'idée est que je veux un hachage plus tard où chaque nom aura un hachage avec des attributs respectifs:Ruby 1.9: transforme ces 4 tableaux en hachage de paires clé/valeur

date Exemple provenant du client:

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

sortie Je voudrais obtenir:

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 } 

Je veux avoir un tableau à la fin de la journée où je peux itérer et travailler sur chaque hash de personne en particulier.

Il n'est pas nécessaire d'avoir un nombre équivalent de valeurs dans chaque tableau. Signification, les noms sont nécessaires .. et je pourrais recevoir 5 d'entre eux, mais je pourrais seulement recevoir 3 dates de naissance, 2 couleurs préférées et 1 emplacement. Chaque valeur manquante donnera un résultat nul. Comment faire ce type de structure de données avec Ruby 1.9?

+0

Si vous avez 5 noms et 2 couleurs, comment savez-vous quelles couleurs appartiennent à quels noms? – zenazn

+0

tout dans la 0e rangée appartient ensemble dans un hachage, tout dans la 1ère position d'élément appartient ensemble et vers l'avant. Toute valeur manquante entraîne un résultat nul. C'est probablement un travail pour zip et d'autres méthodes de tableau de rubis fantaisie. – randombits

Répondre

2

je ne serais probablement pas comme ça

# 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

Une petite classe pour représenter une personne

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 

une autre pour représenter les gens, ce qui est principalement juste une liste des personnes. Je ai jeté une jolie fonction d'impression pour chacun de sorte que vous pouvez voir leurs données. Avec un point de départ comme celui-ci, il sera vraiment facile de modifier et d'ajouter des méthodes qui font toutes sortes de choses utiles.

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 
0

Je pense que le type de structure de données que vous recherchez est -ahem- un Struct.

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