Вход/Регистрация
Программирование на языке Ruby
вернуться

Фултон Хэл

Шрифт:
Листинг 8.1. Хэш с повторяющимися ключами

class HashDup

 def initialize(*all)

raise IndexError if all.size % 2 != 0

@store = {}

if all[0] # не nil

keyval = all.dup

while !keyval.empty?

key = keyval.shift

if @store.has_key?(key)

@store[key] += [keyval.shift]

else

@store[key] = [keyval.shift]

end

end

end

 end

 def store(k,v)

if @store.has_key?(k)

@store[k] += [v]

else

@store[k] = [v]

end

 end

 def [](key)

@store[key]

 end

 def []=(key,value)

self.store(key,value)

 end

 def to_s

@store.to_s

 end

 def to_a

@store.to_a

 end

 def inspect

@store.inspect

 end

 def keys

result=[]

@store.each do |k,v|

result += ([k]*v.size)

end

result

 end

 def values

@store.values.flatten

 end

 def each

@store.each {|k,v| v.each {|y| yield k,y}}

 end

 alias each_pair each

 def each_key

self.keys.each {|k| yield k}

 end

 def each_value

self.values.each {|v| yield v}

 end

 def has_key? k

self.keys.include? k

 end

 def has_value? v

self.values.include? v

 end

 def length

self.values.size

 end

 alias size length

 def delete k

val = @store[k]

@store.delete k

val

 end

 def delete k,v

@store[k] -= [v] if @store[k]

v

 end

 # Остальные методы опущены...

end

# He будет работать... для повторяющихся ключей

# актуально только последнее значение.

h = {1=>1, 2=>4, 3=>9, 4=>16, 2=>0}

# А так будет...

h = HashDup.new(1,1, 2,4, 3,9, 4,16, 2,0)

k = h.keys # [4, 1, 2, 2, 3]

v = h.values # [16, 1, 4, 0, 9]

n = h.size # 5

h.each {|k,v| puts "#{k} => #{v}"}

# Печатается:

# 4 => 16

# 1 => 1

# 2 => 4

# 2 => 0

# 3 => 9

Но если не пользоваться литеральными хэшами, то задача решаема. В листинге 8.1 реализован класс, содержащий атрибут

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

  • Читать дальше
  • 1
  • ...
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: