2

拒否!、delete_if、select、keep_ifなどに少しおびえています。

http://www.ruby-doc.org/core-1.9.3/Array.html#method-i-reject

失われた要素の数を出力しながら、{}ブロックの条件に一致しない要素を削除して配列を変更する最短の方法は何ですか?

例えば。

  puts "Filtered out #{(siglist.reject!{|r| r[:ret] < $retmin }).size} whose :ret < retmin(#{$retmin})"  

拒否後、配列内の残りの要素の数のみを出力するようです。

4

2 に答える 2

2

確かにローテクですが、前後の配列の長さの違いによって拒否された値の数を見つけることができます。

previous_length = siglist.size
puts "Filtered out #{previous_length - (siglist.reject!{|r| r[:ret] < $retmin }).size} whose :ret < retmin(#{$retmin})"
于 2012-08-14T22:34:11.737 に答える
1

非Bangメソッドを使用して、比較用の新しい配列を作成します

これに対処するために私が考えることができる最善の方法は、比較のために元の配列をそのままにしておくことです。例えば:

array = *(1..9)
new_array = array.reject { |i| i.odd? }
puts "Threw away #{ array.count - new_array.count } elements"
# => Threw away 5 elements

または、配列に対してset操作を使用することもできます。入力するのは短いですが、最終的な結果は同じです。

array - new_array
# => [1, 3, 5, 7, 9]

puts "Threw away %d elements" % (array - new_array).count
# => Threw away 5 elements

言い換えれば、拒否された要素をどのようにカウントするかはあなた次第ですが、2つの配列を比較することは、拒否された要素を追跡するために私が知っている最も簡単な方法です。

于 2012-08-14T22:48:06.300 に答える