ハッシュから指定した条件が真になる要素をすべて削除する

Hash クラスのオブジェクトに含まれるキーと値を使った条件式を定義し、条件式が真になる要素を Hash クラスのオブジェクトから削除します。ここでは Ruby でハッシュオブジェクトから指定した条件が真になる要素をすべて削除する方法について解説します。

(Last modified: )

条件が真になる要素をすべて削除する

Hash クラスのオブジェクトに含まれるキーと値に対してブロック内で処理を実行し、結果が true の要素を取り除く方法です。 Hash クラスで用意されている delete_if メソッドを使います。

Hashオブジェクト.delete_if {|key, value| ... }

delete_if メソッドはブロック内でキーと値を使って実行する文を記述します。キーと値はブロック内の |key, value| の箇所に書かれた変数で参照できます。ブロック内の処理が真( true )となった場合は、該当する要素をハッシュオブジェクトから削除します。

例えば次のように記述します。

h = {"suzuki" => 87, "itou" => 76, "yamada" => 69}

h.delete_if {|key, value|
  value < 80
}

この場合、要素の値が 80 よりも小さい要素を削除します。

また同じことを行うメソッドとして Hash クラスでは reject! メソッドが用意されています。

Hashオブジェクト.reject! {|key, value| ... }

reject! メソッドは delete_if> メソッドと同じ処理を行いますが、削除するキーと値が無かった場合に戻り値として「nil」を返します。

複製されたハッシュオブジェクトから要素を削除する

自分自身のハッシュオブジェクトから要素を削除する代わりに、ハッシュオブジェクトを複製した上で要素を削除するメソッドも用意されています。 Hash クラスで用意されている reject メソッドを使います。

Hashオブジェクト.reject {|key, value| ... }

reject メソッドはブロック内でキーと値を使って実行する文を記述します。キーと値はブロック内の |key, value| の箇所に書かれた変数で参照できます。ブロック内の処理が真( true )となる要素を、複製されたハッシュオブジェクトから削除します。

例えば次のように記述します。

h = {"suzuki" => 87, "itou" => 76, "yamada" => 69}

newHash = h.delete_if {|key, value|
  value < 80
}

この場合、元のハッシュオブジェクトはそのままで、ハッシュオブジェクトを複製した上で要素の値が 80 より小さい要素を削除したハッシュオブジェクトを返します。

サンプルコード

では簡単なサンプルで試してみます。

# encoding: UTF-8

h = {"suzuki" => 87, "itou" => 76, "yamada" => 69}
p(h)

puts("値が80よりも小さい要素を削除します")
h.delete_if {|key, value|
  value < 80
}
p(h)

puts()

h = {"suzuki" => 87, "itou" => 76, "yamada" => 69}
p(h)

puts("値が80よりも小さい要素を削除します")
h2 = h.reject {|key, value|
  value < 80
}
p(h)
p(h2)

実行結果は次のようになります。

キーと値毎に判定を行い該当するキーと値を取り除く

-- --

Ruby でハッシュオブジェクトから指定した条件が真になる要素をすべて削除する方法について解説しました。

( Written by Tatsuo Ikura )

プロフィール画像

著者 / TATSUO IKURA

これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。