LJZN

每天更新Rails练习项目到Github~

» Home
» Category
» About Me
» Github

39散列,可爱的散列

01 Jul 2016 » LRTHW
# create a mapping of state to abbreviation
states = {
	'Oregon' => 'OR',
	'Florida' => 'FL',
	'California' => 'CA',
	'New York' => 'NY',
	'Michigan' => 'MI'
}

# create a basic set of states and some cities in them
cities = {
	'CA' => 'San Francisco',
	'MI' => 'Detroit',
	'FL' => 'Jacksonville'
}

# add some more cities
cities['NY'] = 'New York'
cities['OR'] = 'Portland'

# puts out some cities
puts '-' * 10
puts "NY State has: #{cities['NY']}"
puts "OR State has: #{cities['OR']}"

# puts some states
puts '-' * 10
puts "Michigan's abbreviation is: #{states['Michigan']}"
puts "Florida's abbreviation is: #{states['Florida']}"

# do it by using the state then cities dict
puts '-' * 10
puts "Michigan has: #{cities[states['Michigan']]}"
puts "Florida has: #{cities[states['Florida']]}"

# puts every state abbreviation
puts '-' * 10
states.each do |state, abbrev|
	puts "#{state} is abbreviated #{abbrev}"
end

# puts every city in state
puts '-' * 10
cities.each do |abbrev, city|
	puts "#{abbrev} has the city #{city}"
end

# now do both at the same time
puts '-' * 10
states.each do |state, abbrev|
	city = cities[abbrev]
	puts "#{state} is abbreviated #{abbrev} and has city #{city}"
end

puts '-' * 10
# by default ruby says "nil" when something isn't in there
state = states['Texas']

if !state
	puts "Sorry, no Texas."
end

# default values using ||= with the nil result
city = cities['TX']
city ||= 'Does Not Exist'
puts "The city for the state 'TX' is: #{city}"

创建函数

module Dict
	def Dict.new(num_buckets=256)
		#Initializes a Dict with the given number of buckets.
		aDict = []
		(0...num_buckets).each do |i|
			aDict.push([])
		end

		return aDict
	end

	def Dict.hash_key(aDict, key)
		# Given a key this will create a number and then convert it to
		# an index for the aDict's buckets.
		return key.hash % aDict.length
	end

	def Dict.get_bucket(aDict, key)
		#Given a key, find the bucket where it would go
		bucket_id = Dict.hash_key(aDict, key)
		return aDict[bucket_id]
 	end

	def Dict.get_slot(aDict, key, default=nil)
		# Returns the index, key, and value of a slot found in a bucket.
		bucket = Dict.get_bucket(aDict, key)
		
		bucket.each_with_index do |kv, i|
			k, v = kv
			if key == k
				return i, k, v
			end
		end
		
		return -1, key, default
	end
	
	def Dict.get(aDict, key, default=nil)
		# Gets the value in a bucket for the given key, or the default.
		i, k, v = Dict.get_slot(aDict, key, default=default)
		return v
	end
	
	def Dict.set(aDict, key, value)
		# Sets the key to the value, replacing any existing value.
		bucket = Dict.get_bucket(aDict, key)
		i, k, v = Dict.get_slot(aDict, key)
		
		if i >= 0
			bucket[i] = [key, value]
		else
			bucket.push([key, value])
		end
	end
	
	def Dict.delete(aDict, key)
		# Deletes the given key from the Dict.
		bucket = Dict.get_bucket(aDict, key)
		
		(0...bucket.length).each do |i|
			k, v = bucket[i]
			if key == k
				bucket.delete_at(i)
				break
			end
		end
	end
	
	def Dict.list(aDict)
		# Prints out what's in the Dict.
		aDict.each do |bucket|
			if bucket
				bucket.each {|k, v| puts k, v}
			end
		end
	end
end

修改后

require './dict.rb'

# create a mapping of state to abbreviation
states = Dict.new()
Dict.set(states, 'Oregon', 'OR')
Dict.set(states, 'Florida', 'FL')
Dict.set(states, 'California', 'CA')
Dict.set(states, 'New York', 'NY')
Dict.set(states, 'Michigan', 'MI')

# create a basic set of states and some cities in them
cities = Dict.new()
Dict.set(cities, 'CA', 'San Francisco')
Dict.set(cities, 'MI', 'Detroit')
Dict.set(cities, 'FL', 'Jacksonville')

# add some more cities
Dict.set(cities, 'NY', 'New York')
Dict.set(cities, 'OR', 'Portland')


# puts out some cities
puts '-' * 10
puts "NY State has: #{Dict.get(cities, 'NY')}"
puts "OR State has: #{Dict.get(cities, 'OR')}"

# puts some states
puts '-' * 10
puts "Michigan's abbreviation is: #{Dict.get(states, 'Michigan')}"
puts "Florida's abbreviation is: #{Dict.get(states, 'Florida')}"

# do it by using the state then cities dict
puts '-' * 10
puts "Michigan has: #{Dict.get(cities, Dict.get(states, 'Michigan'))}"
puts "Florida has: #{Dict.get(cities, Dict.get(states, 'Florida'))}"

# puts every state abbreviation
puts '-' * 10
Dict.list(states)

# puts every city in state
puts '-' * 10
Dict.list(cities)

puts '-' * 10
# by default ruby says "nil" when something isn't in there
state = Dict.get(states, 'Texas')

if !state
	puts "Sorry, no Texas."
end

# default values using ||= with the nil result
city = Dict.get(cities, 'TX', 'Does Not Exist')
puts "The city for the state 'TX' is: #{city}"

Related Posts