Hatena::Grouprubyist

krystal: プログラミング超初心者(文系)

2008-12-15 (Mon)たのしいRuby練習問題

OrderedHashを定義してみよう

20:25

  • 順番を保存するハッシュクラスを定義する
  • 以下のような動きをすることとする
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 < Hash
  def initialize
    @index1 = []          #配列にする
    @index2 = []
  end
  
  def []=(key,value)      #[]= をオーバーライドしている
    @index1.delete(key)   #重複を避ける
    @index1.push(key)     #keyを配列に入れる
    @index2.delete(value) #重複を避ける
    @index2.push(value)
    super(key,value)      #superは現在のメソッドがオーバーライドしているメソッドを呼び出す
  end

  def keys
    @index1.each{|key|
      ary1 = Array.new << key
    }
  end
  
  def values
    @index2.each{|value|
      ary2 = Array.new << value
    }
  end
end
oh = OrderedHash.new
p oh                       #=>  {}
oh["puppy"] = 1            
oh["kitty"] = 2             
oh["snoopy"] = 3             
oh["daisy"] = 4              
oh["aho"] = "ahoaho"         
oh["kitty"] = 3              
p oh                       #=>  {"snoopy"=>3, "kitty"=>3, "aho"=>"ahoaho", "daisy"=>4, "puppy"=>1}
p oh.keys                  #=>  ["puppy", "snoopy", "daisy", "aho", "kitty"]
p oh.values                #=>  [1, 2, 4, "ahoaho", 3]

配列にして取り出そうと考えたが、うまくできず。結局他人が書いたものを参考にしたが、全部理解できなくて、自分なりに変更して書いてみたけど、はやり問題が要求している動きはしていない。→ keyとvalueは関連付けされてないみたい。