2016-09-02 8 views
1

配列から特定の値を削除するための削除methodsはすべて、指定された値のすべてのインスタンスを削除するようです。その立場を知らないと、どうすれば1つのインスタンスだけを削除できますか?Rubyの配列から値のインスタンスを1つだけ削除するには?

foo = 4,4,3,2,6 
foo -= [4] 
p foo # --> [3, 2, 6] 

I(4)

I値のインスタンスがその中に存在する場合に識別およびインスタンスの数をカウントする配列を照会することができfoo.deleteと同じ結果を得る:

foo = 4,4,3,2,6 
foo.include?(4) # <-- true 
foo.count(4) # <-- 2 

例えば、ダイスロールのアレイはヤッツィーのゲームのために作られた、場合:

roll_1 = Array.new(5) {rand(1..6)} 

とresulプレイヤーは[4、4、3、2、6]のいずれかを選び、ストレートには2、3、& 4のいずれかを選びます。プレイヤーが1つのストレートに対して4つのストーリーを保持したい場合、値が配列内にあると確認されるように、この単一のインスタンスをどのように選択できますか?

答えて

2

あなたは、その要素を削除するには、最初に一致した要素のインデックス、および#delete_at(または#slice!)を見つけるために#index(または#find_index)を使用することができます。この問題を論じ

foo.delete_at(foo.index(4)) 

Hereの別のスレッド。フラグが反転するまで

foo.delete_at(foo.index(4) || foo.length) 

あなたはフラグ変数と#delete_ifを使用することができます:

flag = false 
foo.delete_if { |i| break if flag; !flag and i == 4 and flag = true } 

あなたは可能性が彼らは、検索対象の配列に値が表示されない場合には、ガードを追加することをお勧めします、マッチや非マッチに配列を分割マッチの1を削除し、配列reconcatenate:

matches, foo = foo.partition { |i| i == 4 } 
foo.concat(matches[0..-2]) 

をしかし、私は最初のオプションがベストだと思います。 :-)

+0

これはやってみましょう。条件の記述を書いたので、私はそれが二重の機能であることに気づいたはずです - ありがとう! –

+0

@ Mr.Kennedyそれはもっと優雅なRuby-ishの方法がないというのは奇妙なようですが、これはやる必要があると思います! – mwp

+0

それは私だけではないと聞くのは良いです。私は(明らかに)Rubyを初めて知っていますが、特にこれを見てからです:https://youtu.be/3wIDoPmmpdoもっとRubyiciousなソリューションがあると思いました。 –

関連する問題