Hatena::Grouprubyist

Ruby初心者prinyの学習帳 RSSフィード

2008-12-24練習:たのしいRuby P.244 (2) OrderedHash クラスを定義する

順番を保存し、以下のような動きをするハッシュ、OrderedHash クラスを定義する。

oh = OrderedHash.new
oh["one"] = 1
oh["two"] = 2
oh["three"] = 3
oh["two"] = 4
p oh.keys #=> ["one", "two", "three"]
p oh.values #=> [1, 4, 3]

書いたもの

class OrderedHash
  def initialize
    # キーの順番を保持する配列をつくる
    @index = []
    # キーとバリューを結びつけて保存するハッシュをつくる
    @element = {}
  end
  
  # キーを指定してバリューを取得する
  def [](key)
    @element[key]
  end
  
  # ハッシュに要素を追加する
  def []=(key, value)
    @element[key] = value
    unless @index.include?(key)
      @index << key
    end
  end
  
  # キーに対する関連を取り除く。取り除かれた値を返す
  def delete(key)
    @index.delete(key)
    @element.delete(key)
  end
  
  # すべてのキーの配列を返す
  def keys
    @index.dup
  end
  
  # すべてのバリューの配列を返す
  def values
    @index.map{|key| @element[key]}
  end
  
  # each でハッシュに入れた順番に処理する
  def each
    @index.each do |key|
      yield([key, self[key]])
    end
    self
  end
end

animals = OrderedHash.new
animals["cat"] = "meow"
animals["dog"] = "bowwow"
animals["owl"] = "tu-whit, tu-whoo"
animals["dog"] = "yap yap"
animals["sheep"] = "maa"

p animals["sheep"]
puts

animals.each do |i|
  p i
end
puts

p animals.delete("owl")
p animals.delete("rabbit")
puts

p animals.keys
p animals.values

実行結果

"maa"

["cat", "meow"]
["dog", "yap yap"]
["owl", "tu-whit, tu-whoo"]
["sheep", "maa"]

"tu-whit, tu-whoo"
nil

["cat", "dog", "sheep"]
["meow", "yap yap", "maa"]

順番が保存されていることがわかりやすいのは、OrderedHash#each したときかなと思ったのでつくってみた。
あと、追加できるなら、取り除くのもできたほうがいいと思ったので OrderedHash#delete も。

メソッド名にアンダーバー以外の記号([] と =)を使うのは初めてで、ふしぎなかんじがした。

JaylinJaylin2011/09/07 20:59So true. Hoentsy and everything recognized.

kjsmlrsbkjsmlrsb2011/09/07 22:37UfxjO0 <a href="http://ispuayidiexg.com/">ispuayidiexg</a>

gtqprkibgtqprkib2011/09/08 20:48Y3FXr6 , [url=http://bpuhojptmeya.com/]bpuhojptmeya[/url], [link=http://vbrqtkfusrcx.com/]vbrqtkfusrcx[/link], http://qkqkyhuwvpwf.com/

hokmzccxhokmzccx2011/09/09 17:55HdeVtz <a href="http://mkwgswniuwhi.com/">mkwgswniuwhi</a>

lqkncbgphlqkncbgph2011/09/10 22:57vrgfkT , [url=http://tclogszrvoeg.com/]tclogszrvoeg[/url], [link=http://ltaccopoogfv.com/]ltaccopoogfv[/link], http://seyoxmubqjzt.com/