連想配列(マップ/ハッシュ/ディクショナリ)の要素の値を参照するには 2021/01/14
Java、Scala、JavaScript、PHP、Perl、Ruby、Pythonでの連想配列(マップ/ハッシュ/ディクショナリ)の要素の値を参照する方法。
Java 2015/03/23
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 2015/03/23
Signature:
def Map[A, B]#apply(key: A): B
def Map[A, B]#get(key: A): Option[B]
def Map[A, B]#getOrElse(key: A, default: => B): B
例
// 要素が存在しない場合は NoSuchElementException がスローされる
map("a")
// Option で取得
// 要素が存在しない場合は None が返される
map.get("a")
// 要素が存在しない場合のデフォルト値を指定
map.getOrElse("a", 0);
apply
という名前のメソッドはScalaではメソッド名を省略してレシーバーとなるオブジェクト自体があたかも関数であるかのように呼び出すことができる。上記例の1つ目がそれ。
3つ目の getOrElse
では2つ目の引数がデフォルト値となる。要素が存在する場合には、2つ目の引数が評価されないので、計算に時間のかかるデフォルト値を設定してもよい。
JavaScript 2014/01/22
例
map = {a: 1, b: 2}
console.log(map.a);
// => 1
console.log(map['a']);
// => 1
PHP 2014/12/22
配列の要素は []
でアクセスする。
$arr['a']
ただし、存在しない要素を取得しようとすると PHP Notice: Undefined index: a
というようなNoticeが発生する。
@$arr['a']
と書けば、Noticeは発生しない。
Perl
ハッシュ 2021/01/25
以下のように {}
でキーを指定し、変数名の先頭は $
を使う。
my %hash = (a => 1, b => 2);
$hash{a} # => 1
# または
$hash{'a'} # => 1
$hash{"a"} # => 1
存在しない要素を取得しようとすると undef
になり、use warnings;
が宣言されていれば、undef
が代入された変数を実際に使おうとするときに Use of uninitialized value
という警告が表示される。
undef
という値の要素が存在することもあり得る。
ハッシュへのレファレンス 2021/01/25
ハッシュへのレファレンスから要素を取り出すには ->{}
を使う。
my $hash = {a => 1, b => 2};
$hash->{a} # => 1
# または
$hash->{'a'} # => 1
$hash->{"a"} # => 1
存在しない要素の場合の取り扱いはハッシュと同じ。
Ruby 2015/03/23
ハッシュの要素は []
でアクセスする。
hash['a']
または
hash.fetch('a')
存在しない要素を取得しようとすると []
では nil
が返され、fetch
は KeyError
の例外が発生する。
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 2014/12/22
ディクショナリの要素は []
でアクセスする。
dic['a']
ただし、存在しない要素を取得しようとすると KeyError
の例外が発生する。存在するかどうかが不確かな場合は事前にin
演算子でチェックする必要がある。
get
メソッでであれば存在しない要素であっても例外が発生しない。
dic = {'a': 1, 'b': 2}
print(dic.get('c'))
# => None