Skip to content

Instantly share code, notes, and snippets.

@elvanja
Created January 8, 2013 11:28
Show Gist options
  • Save elvanja/4483079 to your computer and use it in GitHub Desktop.
Save elvanja/4483079 to your computer and use it in GitHub Desktop.
A little comparison between groovy and ruby nested hashes with defaults
class Person {
public name
public gender
public age
public Person(name, gender, age) {
this.name = name
this.gender = gender
this.age = age
}
def decade() {
return "${age - (age % 10)}+"
}
}
family = [
new Person("Sofia", "female", 1),
new Person("Aiko", "female", 1),
new Person("Vanja", "male", 37),
new Person("Branka", "female", 38),
new Person("Fuma", "female", 83),
new Person("Ranko", "male", 64),
new Person("Mira", "female", 64),
new Person("Tomo", "male", 67),
new Person("Zorica", "female", 66),
new Person("Greta", "female", 14),
new Person("Gael", "male", 21),
new Person("Vigo", "male", 11),
new Person("Mitchell", "male", 43),
new Person("Michel", "female", 22)
]
by_gender_and_decade = [:].withDefault() { [:].withDefault() {0} }
family.each { person ->
by_gender_and_decade[person.gender][person.decade()] += 1
}
def prettify(hash) {
return hash.collect { key, value -> "${key} / ${value}" }.join(", ")
}
println "Family members by gender and age group:"
println "female: ${prettify(by_gender_and_decade["female"])}"
println "male: ${prettify(by_gender_and_decade["male"])}"
Person = Struct.new(:name, :gender, :age) {
def decade
"#{age - (age % 10)}+"
end
}
family = [
Person.new("Sofia", :female, 1),
Person.new("Aiko", :female, 1),
Person.new("Vanja", :male, 37),
Person.new("Branka", :female, 38),
Person.new("Fuma", :female, 83),
Person.new("Ranko", :male, 64),
Person.new("Mira", :female, 64),
Person.new("Tomo", :male, 67),
Person.new("Zorica", :female, 66),
Person.new("Greta", :female, 14),
Person.new("Gael", :male, 21),
Person.new("Vigo", :male, 11),
Person.new("Mitchell", :male, 43),
Person.new("Michel", :female, 22)
]
by_gender_and_decade = Hash.new { |hash, key| hash[key] = Hash.new(0) }
family.each do |person|
by_gender_and_decade[person.gender][person.decade] += 1
end
def prettify(hash)
hash.collect { |key, value| "#{key} / #{value}" }.join(", ")
end
puts "Family members by gender and age group:"
puts "female: #{prettify(by_gender_and_decade[:female])}"
puts "male: #{prettify(by_gender_and_decade[:male])}"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment