2

SomeClassを分類するとします。

class SomeClass < SomeClassThatAssignAttributesOnInitialization
  attr_accessor :group
  attr_accessor :name
end

そしてそのインスタンスの配列

arr = [SomeClass.new(group:0, name:'one'),
       SomeClass.new(group:0, name:'two'),
       SomeClass.new(group:1, name:'three'),
       SomeClass.new(group:1, name:'four')]

各グループの最初の要素を配列に入れる必要があります。

今では次のように機能します

current_group = nil
first_elements = arr.map do |instance|
  if current_group != instance.group
    current_group = instance.group
    instance.name
  end
end

これは問題なく動作しますが、それを行うにはある種の「ルビー」の方法があると思います。

誰か助けてもらえますか?

ありがとう

4

4 に答える 4

3

Rubyには、オブジェクトに対して便利なgroup_byメソッドがあり、 :Enumerableを返します。Hash

arr.group_by(&:group)
# => {0=>[#<SomeClass group=0, name="one">, #<SomeClass group=0, name="two">], 1=>[#<SomeClass group=1, name="three">, #<SomeClass group=1, name="four">]}

したがって、いくつかのメソッドをその最後にチェーンするだけです。

arr.group_by(&:group).values.map {|vs| vs[0].name}
# => ["one", "three"]
于 2012-12-18T14:56:19.340 に答える
2
arr.group_by(&:group).values.map(&:first)
于 2012-12-18T14:56:50.370 に答える
1
SomeClass = Struct.new(:group, :name)

arr = [
  SomeClass.new(0, 'one'),
  SomeClass.new(0, 'two'),
  SomeClass.new(1, 'three'),
  SomeClass.new(1, 'four')
]

arr.group_by(&:group).values.map(&:first)
# => [
#   #<struct SomeClass group=0, name="one">,
#   #<struct SomeClass group=1, name="three">
# ]

または、名前だけを取得するには:

arr.group_by(&:group).values.map(&:first).map(&:name)
于 2012-12-18T15:01:20.350 に答える
1

なぜだけではないのですか:

first_elements = arr.map(&:name)
于 2012-12-18T14:52:59.480 に答える