index page
目次へ戻る   前へ戻る 次へ進む

ハッシュ


  • ハッシュを作る
    配列には番号によるインデックスがついていました。しかし、番号でなく名前でインデックスをつけたい場合があります。例えば、次のような種名に対応する科名を配列のようなもので管理したい場合です。

    Miscanthus sinensis:Poaceae
    Imperata cylindrica:Poaceae
    Spiranthes sinensis:Orchidaceae
    Arnica unalascensis:Compositae
    Lactuca indica:Compositae


    註:自分用にプログラミングしているときは、データとしては日本語のカタカナなどを使っています。このページであえて学名を使っているのは、WinRubyで日本語を使うと文字化けしてしまうからです。

    ここで登場するのがハッシュです。ハッシュでは、配列のインデックスに当たるものをキーといい、要素にあたるのもを値といいます。

    ハッシュを作るのにもいくつか方法があります。

    #ハッシュを作る方法その1
    species_hash = Hash.new                  #species_hashというハッシュを作る
    species_hash["Miscanthus sinensis"] = "Poaceae"   #Miscanthus sinensisをキーに、Poaceaeを値にする
    species_hash["Imperata cylindrica"] = "Poaceae"   #以下同様です
    species_hash["Spiranthes sinensis"] = "Orchidaceae"
    species_hash["Arnica unalascensis"] = "Compositae"
    species_hash["Lactuca indica"] = "Compositae"
    p species_hash                           #p は puts に似ているが、ハッシュなどの中身を出力する
    
    species_hash.clear                       #ハッシュをの中身を空っぽにする
    p species_hash
    
    #ハッシュを作る方法その2
    species_hash = { "Miscanthus sinensis" => "Poaceae",
                     "Imperata cylindrica" => "Poaceae",
                     "Spiranthes sinensis" => "Orchidaceae",
                     "Arnica unalascensis" => "Compositae",
                     "Lactuca indica" => "Compositae"
                   }
    p species_hash
    

    上のプログラムを実行すると次のようになるはずです。

    {"Imperata cylindrica"=>"Poaceae",            #本当はここでは改行されません
     "Arnica unalascensis"=>"Compositae",         #ページが横に長くなってしまうので
     "Spiranthes sinensis"=>"Orchidaceae",        #わざと改行しています
     "Lactuca indica"=>"Compositae",
     "Miscanthus sinensis"=>"Poaceae"}
    {}
    {"Imperata cylindrica"=>"Poaceae",
     "Arnica unalascensis"=>"Compositae",
     "Spiranthes sinensis"=>"Orchidaceae",
     "Lactuca indica"=>"Compositae",
     "Miscanthus sinensis"=>"Poaceae"}
    

    ハッシュを作るには、まず配列と同じように Hash.new というように new というメソッドを作って、その後に代入していく方法があります。
    ハッシュの名前[キー] = 値 という書き方です。

    2つ目は { キー => 値 } というように、 { } で囲んで作る方法です。複数のキーと要素の組合せを使いたい場合には、「,」で区切りをつけて書いてきます。

    一度 clear というメソッドでハッシュの中身は空っぽになっています。2つ目の方法で作っても、はじめのところで代入された内容と同じものが入っていることがわかります。
    ところで、ハッシュは配列と違い、キーに順番と言うのはありません。実際出力されたのも、プログラムの順番とは違っています。

    ところで、2つ目の方法では注意しなければならないことがあります。

    species_hash = { "Miscanthus sinensis" => "Poaceae" }
    species_hash = { "Imperata cylindrica" => "Poaceae" }
    species_hash = { "Spiranthes sinensis" => "Orchidaceae" }
    species_hash = { "Arnica unalascensis" => "Compositae" }
    species_hash = { "Lactuca indica" => "Compositae" }
    
    p species_hash
    
    こういう風に書くと、上の2つ目の方法と同じようにハッシュを作ったつもりになります。しかし、実際は次のように出力されます。

    {"Lactuca indica"=>"Compositae"}
    
    これは、 species_hash というハッシュに対してキーと値の組合せを追加しているのではなく、新たな species_hash を作ってそれに新たなハッシュに対してキーと値の組合せ代入しているからです。


  • キーや値を取り出す
    キーを指定して値を取り出すにはハッシュの作り方の1つ目でやった方法の逆をすればできます。

    p species_hash["Miscanthus sinensis"]       #Miscanthus sinensisというキーの値を取出す
    p species_hash["Imperata cylindrica"]
    p species_hash["Lactuca indica"]
    
    "Poaceae"
    "Poaceae"
    "Compositae"
    

    キーの一覧を取出したり、値の一覧を取出すには、keys や values というメソッドを使います。

    p species_hash.keys                          #キーの一覧を取出す(順番はバラバラ)
    p species_hash.values                        #値の一覧を取出す(順番はバラバラ)
    
    ["Imperata cylindrica", "Arnica unalascensis", "Spiranthes sinensis",  #ここも本当は改行されません
     "Lactuca indica", "Miscanthus sinensis"]
    ["Poaceae", "Compositae", "Orchidaceae", "Compositae", "Poaceae"]
    

    キーや値、あるいはキーと値の組み合わせを次々と取出すには、each_key や values 、あるいは each というメソッドを使います。これらの使い方は、配列のところで出てきた each とほとんど同じです。詳しくは下の例を見てください。

    species_hash.each_key{ |key|     #species_hashのキーをそれぞれ key という変数にに代入
        p key
    }
    print "\n"                       #区切りのための改行
    species_hash.each_value{ |value| #species_hashの値をそれぞれ value という変数にに代入
        p value
    }
    print "\n"
    species_hash.each_value{ |key,value|
                                     #species_hashのキーと値をそれぞれ key と value という変数にに代入
        p key,"\t",value,"\n"        #\tはタブ文字
    }
    
    "Imperata cylindrica"
    "Arnica unalascensis"
    "Spiranthes sinensis"
    "Lactuca indica"
    "Miscanthus sinensis"
    
    "Poaceae"
    "Compositae"
    "Orchidaceae"
    "Compositae"
    "Poaceae"
    
    Imperata cylindrica	Poaceae
    Arnica unalascensis	Compositae
    Spiranthes sinensis	Orchidaceae
    Lactuca indica	Compositae
    Miscanthus sinensis	Poaceae
    

    だんだんと技が増えてきました。次のページではファイルからデータを読み込む方法を説明します。基本中の基本の説明は次のページで終わりです。
    そのあとは、いよいよ実践的な内容になります。


    目次へ戻る   前へ戻る 次へ進む