2012-03-01 11 views
7

更新:申し訳ありませんが、私は私のプログラムを修正:`each`イテレータの前の項目と比較する方法は?

a = [ 'str1' , 'str2', 'str2', 'str3' ] 
name = '' 
a.each_with_index do |x, i | 
    if x == name 
    puts "#{x} found duplicate." 
    else 
    puts x 
    name = x if i!= 0 
    end 
end 



    output: 
str1 
str2 
str2 found duplicate. 
str3 

は同じことを行うにはruby言語で別の美しい方法はありますか?

btw、実際には。 aは私の実際のケースではActiveRecord::Relationです。

ありがとうございました。

+1

言葉を意図的に説明しようとすると、コードがバグのように見えます(特に 'x [i-1]'は意味がありません)。最善の方法:入力と期待される出力のいくつかの例を挙げてください。 – tokland

+0

ありがとう、私は私のプログラムを修正しました。 –

+0

each_consはまだ適していますか? –

答えて

16

を使用することができます〜を通じてn-1対(Enumerableの長さがnの場合)。場合によっては、最初の(または最後の)要素のエッジケースを個別に処理する必要があることを意味します。その場合

、それはeach_consに似methodを実装するのはとても簡単ですが、(elem0, elem1)を生成each_consとは対照的に、最初の要素(、用(nil, elem0)をもたらすことになる:あなたはおそらくしたいと

module Enumerable 
    def each_with_previous 
    self.inject(nil){|prev, curr| yield prev, curr; curr} 
    self 
    end 
end 
12

あなたがeach_consを使用することができます。

irb(main):014:0> [1,2,3,4,5].each_cons(2) {|a,b| p "#{a} = #{b}"} 
"1 = 2" 
"2 = 3" 
"3 = 4" 
"4 = 5" 
3

あなたはEnumerable#each_consを使用することがあります。

a = [ 'str1' , 'str2', 'str3' , ..... ] 
name = '' 
a.each_cons(2) do |x, y| 
    if y == name 
    puts 'got you! ' 
    else 
    name = x 
    end 
end 
5

あなたがeach_consを持っているかもしれない問題は、それを反復処理ということですeach_cons

a.each_cons(2) do |first,last| 
    if last == name 
    puts 'got you!' 
    else 
    name = first 
    end 
end 
1

重複を持つ以上putsを行う、私はむしろ構造の重複を続けるだろう::での

### question's example: 
a = [ 'str1' , 'str2', 'str2', 'str3' ] 
# => ["str1", "str2", "str2", "str3"] 
a.each_cons(2).select{|a, b| a == b }.map{|m| m.first} 
# => ["str2"] 
### a more complex example: 
d = [1, 2, 3, 3, 4, 5, 4, 6, 6] 
# => [1, 2, 3, 3, 4, 5, 4, 6, 6] 
d.each_cons(2).select{|a, b| a == b }.map{|m| m.first} 
# => [3, 6] 

詳細

関連する問題