これが私の配列です:
num_arr = ["cat","dog","penguin","penguin"]
各インデックス位置の内容が最後のインデックス位置の内容と同じでない限り、それらの内容を印刷したいと思います。この場合、それは出力するループになります...
["cat","dog","penguin"]
編集:最後の要素が最後から2番目の要素と同一でない限り、最後の要素まですべてを印刷したいということです。混乱させて申し訳ありません。
これはどうですか?
num_arr[0...-1] + (num_arr[-2] == num_arr[-1] ? [] : [num_arr[-1]])
冗長ではありませんが、理解するのがやや困難です。
num_arr[0...-2] + num_arr[-2..-1].uniq
#=> ["cat", "dog", "penguin"]
foo = ["cat","dog","penguin","penguin"]
=> ["cat", "dog", "penguin", "penguin"]
answer = foo.reject { |ele| ele == foo.last }
=> ["cat", "dog"]
これがあなたが求めているものだと思います。
new_array = array.each_with_object([]) { |element, result| result << element unless result.last == element }
new_array.each { |element| puts element }
すべての一意のエントリを出力するだけの場合は、この場合uniq
はArrayのメソッドを使用します。
["cat","dog","penguin","penguin"].uniq.map{|a| p a}
コンソール
ruby-1.9.2-p290 :004 > ["cat","dog","penguin","penguin"].uniq.map{|a| p a}
"cat"
"dog"
"penguin"
=> ["cat", "dog", "penguin"]
最後のエントリの比較のみを行いたい場合は、最後のエントリをに保存し@prev
、比較後に現在のエントリに割り当てることで、それを行うことができます。
["cat", "dog", "penguin", "penguin"].map{|a| p a if @prev!=a;@prev=a }
コンソール
ruby-1.9.2-p290 :009 > ["cat", "dog", "penguin", "dog", "penguin"].map{|a| p a if @prev!=a;@prev=a }
"cat"
"dog"
"penguin"
"dog"
"penguin"
ruby-1.9.2-p290 :010 > ["cat", "dog", "penguin", "penguin"].map{|a| p a if @prev!=a;@prev=a }
"cat"
"dog"
"penguin"