2010-05-06 4 views
1

클라이언트에서 들어오는 네 개의 배열이 있습니다. 이름, 생년월일, 좋아하는 색과 위치가 배열되어 있다고 가정 해 봅시다.Ruby 1.9 :이 4 개의 배열을 키/값 쌍의 해시로 바꿉니다.

예 날짜가 클라이언트에서 오는 : 내가 좋아하는 것

[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 위치를받을 수 있습니다. 누락 된 값은 모두 0이됩니다.

Ruby 1.9에서 어떻게 이런 종류의 데이터 구조를 만들 수 있습니까?

+0

5 개의 이름과 2 개의 색상이있는 경우 어떤 색상이 어떤 이름에 속하는지 어떻게 알 수 있습니까? – zenazn

+0

0 번째 행의 모든 ​​것이 하나의 해시에 속하므로 첫 번째 요소 위치의 모든 항목이 함께 포함됩니다. 누락 된 값은 nil이됩니다. 아마도 zip과 다른 멋진 루비 배열 메소드를위한 작업 일 것입니다. – randombits

답변

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 

다른에게, 표현이

# 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

처럼 작은 클래스를 그것을 할 것입니다.

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 
0

데이터 구조의 종류는 -ahem- a 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? 
관련 문제