連想配列(マップ/ハッシュ/ディクショナリ)の要素の値を参照するには

Java、Scala、JavaScript、PHP、Perl、Ruby、Pythonでの連想配列(マップ/ハッシュ/ディクショナリ)の要素の値を参照する方法。

Java

Signature:

V java.util.Map<K, V>#get(Object key)

// Java8以降
V java.util.Map<K, V>#getOrDefault(Object key, V defaultValue)

map.get("a");

getメソッドでは要素が存在しない場合はnullが返される。しかし、nullが返されることは必ずしも要素が存在しない場合とは限らず、値としてnullが入っている場合もあるので注意。

Scala

Signature:

// 要素が存在しない場合は NoSuchElementException がスローされる
map("a")

// Option で取得
// 要素が存在しない場合は None が返される
map.get("a")

// 要素が存在しない場合のデフォルト値を指定
map.getOrElse("a", 0);

applyという名前のメソッドはScalaではメソッド名を省略してレシーバーとなるオブジェクト自体があたかも関数であるかのように呼び出すことができる。上記例の1つ目がそれ。

3つ目の getOrElse では2つ目の引数がデフォルト値となる。要素が存在する場合には、2つ目の引数が評価されないので、計算に時間のかかるデフォルト値を設定してもよい。

JavaScript

map = {a: 1, b: 2}

console.log(map.a);
// => 1

console.log(map['a']);
// => 1

PHP

配列の要素は [] でアクセスする。

$arr['a']

ただし、存在しない要素を取得しようとすると PHP Notice: Undefined index: a というようなNoticeが発生する。

@$arr['a']

と書けば、Noticeは発生しない。

Perl

ハッシュ

以下のように {} でキーを指定し、変数名の先頭は $ を使う。

my %hash = (a => 1, b => 2);

$hash{a}   # => 1
# または
$hash{'a'} # => 1
$hash{"a"} # => 1

存在しない要素を取得しようとすると undef になり、use warnings; が宣言されていれば、undef が代入された変数を実際に使おうとするときに Use of uninitialized value という警告が表示される。

undef という値の要素が存在することもあり得る。

ハッシュへのレファレンス

ハッシュへのレファレンスから要素を取り出すには ->{} を使う。

my $hash = {a => 1, b => 2};

$hash->{a} # => 1
# または
$hash->{'a'} # => 1
$hash->{"a"} # => 1

存在しない要素の場合の取り扱いはハッシュと同じ。

Ruby

ハッシュの要素は [] でアクセスする。

hash['a']

または

hash.fetch('a')

存在しない要素を取得しようとすると [] では nil が返され、fetchKeyError の例外が発生する。

fetch は第2引数またはブロックでデフォルト値を設定することができる。要素が存在しない場合に、第2引数があれば第2引数を返し、ブロックがあれば、それを評価した結果を返す。

hash = {'a' => 1}

p hash.fetch('a')       # => 1
p hash.fetch('a', 2)    # => 1
p hash.fetch('b', 2)    # => 2
p hash.fetch('b') { 2 } # => 2

ハッシュ生成時にブロックを与えれば、[] で存在しない要素を参照しようとした場合に、例外を発生させたり、デフォルト値を返させたりすることができる。

hash = Hash.new { |hash, key| raise KeyError }

hash['a'] = 'A';

p hash['a']
# => "A"
p hash['b']
# KeyError がスローされる

Python

ディクショナリの要素は [] でアクセスする。

dic['a']

ただし、存在しない要素を取得しようとすると KeyError の例外が発生する。存在するかどうかが不確かな場合は事前にin演算子でチェックする必要がある。

getメソッでであれば存在しない要素であっても例外が発生しない。

dic = {'a': 1, 'b': 2}
print(dic.get('c'))
# => None
このサイトは個人メモの集合です。
スポンサーリンク