連想配列(マップ/ハッシュ/ディクショナリ)から特定の条件にマッチする要素のみを取り出すには (filter / select / partition / delete_if)

連想配列(マップ/ハッシュ/ディクショナリ)から特定の条件にマッチする要素のみを取り出す方法。

Scala

Signature:

val map = Map("a" -> 1, "b" -> 2, "c" -> 3);
val filtered = map.filter { case (key, value) =>
  value % 2 != 0;
}
println(filtered);
// => Map(a -> 1, c -> 3)

PHP

array_filter関数でできる。

array_filter関数は、要素のキーではなく値だけが述語関数に渡されるので、要素を抽出するかどうかの判定にキーを使うことはできない。

要素のキーはそのまま保存される。

$arr = array('a' => 1, 'b' => 2, 'c' => 3);

var_export($arr);
// 出力結果
// array (
//   'a' => 1,
//   'b' => 2,
//   'c' => 3,
// )

$filtered = array_filter($arr, function($elem) {
  return $elem % 2 != 0;
});

var_export($filtered);
// 出力結果
// array (
//   'a' => 1,
//   'c' => 3,
// )

PHPは普通の配列と連想配列が同じものなので、 array_filter関数は配列でも使える。

array_filter 関数 | PHP Manual
http://php.net/manual/ja/function.array-filter.php

Ruby

Rubyでは配列と同様のメソッド Hash#select, Hash#partition, Hash#delete_if などを利用できる。

hash = {'a' => 1, 'b' => 2, 'c' => 3}

p hash.select { |key, value| value % 2 != 0 }
# => {"a"=>1, "c"=>3}

p hash.partition { |key, value| value % 2 != 0 }
# => [[["a", 1], ["c", 3]], [["b", 2]]]

p hash.delete_if { |key, value| value % 2 != 0 }
# => {"b"=>2}

Hash#delete_if は破壊的メソッド。

Hash#select はRuby 1.8以前は配列を返していた。

このサイトは筆者(hydrocul)の個人メモの集合です。すべてのページは永遠に未完成です。