プログラミング基礎 II

第十一回 (2011年12月12日)

連想配列

http://www.sw.it.aoyama.ac.jp/2011/PB2/lecture11.html

Martin J. Dürst

AGU

© 2011 Martin J. Dürst 青山学院大学

今日の予定

これからの予定

前回の復習

前回の演習 1

提出: 12月9日 (金曜日) 22:00 までに Moodle に famous_accessors.rb のファイル名で投稿

以前作った famous_people.rb (正解例でも可能; 以前「発展問題」で行った danger を含む) を famous_class.rb で使った class Person に置き換え、必要なアクセスメソッドを追加する。アクセスメソッドの一部は「手作り」、一部は attr_... で書く。

ヒント: 必要以上のアクセスメソッドは作らない

ヒント: 「掃除」されたデータファイル famous_cleaned.txt をダウンロードして使用

正解例: famous_accessors.rb

手書きアクセスメソッドだけ: famous_accessors_by_hand.rb

自動生成アクセスメソッドだけ: famous_accessors_only.rb

前回の演習 2

提出: 12月9日 (金曜日) 22:00 までに Moodle に famous_methods.rb のファイル名で投稿

演習 1 のプログラムで bmi と danger の計算を関数からメソッドに変更しなさい。 更に、出力一行を文字列として返すメソッドも作りなさい。

ヒント:

正解例: famous_methods.rb

前回の演習 2 の書換え

変数無し:

readlines.collect do |input_line|
  Person.new(input_line)
end.sort_by do |person|
  person.weight
end.each do |person|
  puts person.output_line
end

do ... end{ ... } に変更:

readlines
 .collect { |input_line|  Person.new(input_line) }
 .sort_by { |person|  person.weight }
 .each { |person|  puts person.output_line }

famous_cascade.rb

プログラムの書き換えについて

 

配列の限界

配列の限界の具体例

月名の配列:

month_names = [nil, 'January', 'February', 'March', 'April',
'May', 'June', 'July', 'August',
'September', 'October', 'November', 'December']

month_names[12]December

逆のものが欲しい:

month_numbers['December']12

配列では不可能

連想配列の具体例

month_numbers = { 'January' => 1, 'February' => 2, 'March' => 3,
                  'April' => 4, 'May' => 5, 'June' => 6,
                  'July' => 7, 'August' => 8, 'September' => 9,
                  'October' => 10, 'November' => 11, 'December' => 12 }

使用例:

month_numbers['December']12

連想配列

(associative array)

連想配列の例

連想配列の定数

連想配列の使用と変更

使用 (値の取出し):

一般的な形: ハッシュ[キー]

具体例: month_numbers['December']

変更 (値の変更又は要素の追加):

一般的な形: ハッシュ[キー] =

具体例: month_numbers['December'] = 12

要素の削除:

一般的な形: ハッシュ.delete(キー)

具体例: month_numbers.delete('December')

 

連想配列のメソッド

要素 (キー) の存在: ハッシュ.has_key?(キー)

すべてのキー: ハッシュ.keys (→ 配列)

すべての値: ハッシュ.values (→ 配列)

定数

具体例: Translation = { 'height' => '身長', 'normal' => '普通体重', ...}

演習 1

提出: 12月16日 (金曜日) 22:00 までに Moodle に famous_hash.rb のファイル名で投稿

以前作った famous_method.rb (正解例でも可能) に連想配列を追加し、出力する文字列 (height, weight, normal, obese など) を日本語に置き換えるようなプログラムを作成しなさい。

ヒント:

発展問題: 複数の言語が使えるようにする (ハッシュのハッシュ)

演習 2

提出: 12月16日 (金曜日) 22:00 までに Moodle に words.rb のファイル名で投稿

英語などの文書の入力 (< ファイルまたは直接入力) を行と単語に分解し、それぞれの単語の数を数えて、アルファベット順にきれいに出力しなさい。

入力例: Ottos Mops, President Obama's speaches

ヒント: 文字列の delete メソッドで ,.!?;:'" など記号を取り除く

ヒント: スペースを区切りに単語に分割

ヒント: 大文字・小文字の差をなくす

ヒント: 単語を最初に見つけるときともう一つ見つけるときの処理を分ける

発展問題: 単語の頻度順で出力