私は|| =演算子を知っていますが、ここで助けてくれるとは思わない...作成しようとしていますオブジェクトの配列の中の「型」の数を数える配列。Ruby:変数を0に設定する方法、または既に変数が設定されている場合は1を加算する方法
array.each do |c|
newarray[c.type] = newarray[c.type] ? newarray[c.type]+1 ? 0
end
もっと優雅な方法がありますか?
私は|| =演算子を知っていますが、ここで助けてくれるとは思わない...作成しようとしていますオブジェクトの配列の中の「型」の数を数える配列。Ruby:変数を0に設定する方法、または既に変数が設定されている場合は1を加算する方法
array.each do |c|
newarray[c.type] = newarray[c.type] ? newarray[c.type]+1 ? 0
end
もっと優雅な方法がありますか?
types = Hash.new(-1) # It feels like this should be 0, but to be
# equivalent to your example it needs to be -1
array.each do |c|
types[c.type] += 1
end
+1 –
||=
は助けを行います。
types = {}
array.each do |c|
types[c.class] ||= 0
types[c.class] += 1
end
これは最初に1に設定されます... newarray [c.type] || = -1 newarray [c.type] + = 1 –
はい、そうではありませんか?たとえば、arrayが[1]の場合、型は{Fixnum => 1}になります。そして私たちは1つのFixnumを持っています。 –
!types [c.class]の場合、ループの終わりに0に設定する必要があります(1ではなく)。 – Chuck
array.each do |c|
newarray[c.type] = 1 + (newarray[c.type] || -1)
end
また
array.each do |c|
newarray[c.type] ||= -1
newarray[c.type] += 1
end
インデックスが存在しない場合は、デフォルト値を提供することができるためArray#fetch
方法を使用します
array.each do |c|
newarray[c.type] = newarray.fetch(c.type, -1) + 1
end
を
あなたの変数newarray
は、Rubyや他の多くの言語では、配列がClass
のようなランダムオブジェクトではなく、整数でインデックス付けされているので、おかしな名前が付けられています。これはおそらくHash
です。
また、c.type
の代わりにc.class
を使用する必要があります。これは廃止予定です。あなたがHash
を作成しているので、
最後に、あなたがそうのようなinject
を使用することができます。
newarray = array.inject({}) do |h,c|
h[c.class] = h.key?(c.class) ? h[c.class]+1 : 0
h
end
あるいは、ワンライナー用:
newarray = array.inject({}) { |h,c| h[c.class] = h.key?(c.class) ? h[c.class]+1 : 0 ; h }
あなたが見ることができるように、これは与えます望ましい結果:
irb(main):001:0> array = [1, {}, 42, [], Object.new(), [1, 2, 3]]
=> [1, {}, 42, [], #<Object:0x287030>, [1, 2, 3]]
irb(main):002:0> newarray = array.inject({}) { |h,c| h[c.class] = h.key?(c.class) ? h[c.class]+1 : 0 ; h }
=> {Object=>0, Hash=>0, Array=>1, Fixnum=>1}
Ruby 1.8.7以降では、配列の各リストをcount-1に変換し、配列のハッシュをmap
が返すようにします。
Hash[array.group_by(&:class).map { |k,v| [k, v.size-1] }]
2番目の疑問符はコロンである必要があります。 – jonas054