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

広告

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| ... }

戻り値:
  自分自身のハッシュオブジェクト。要素を削除しなかった場合はnil

「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
}

サンプルプログラム

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

LibraryHash6.rb

#! ruby -Ks

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

print("成績が80よりも小さいキーと値を削除します¥n")
h.delete_if {|key, value|
  value < 80
}
p h

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

print("成績が80よりも小さいキーと値を削除します¥n")
newHash = h.reject {|key, value|
  value < 80
}
p h
p newHash

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

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

( Written by Tatsuo Ikura )