3

次のような配列があるとしましょう。 ['x','cat', 'dog', 'x', 'dolphin', 'cougar', 'whale']

配列の長さや「x」がいつ発生するかはわかりません。「x」に到達したら、次の要素に到達するまで、次の要素を新しい配列にプッシュしますincludes?('x')

望ましい出力は次のようになります。 [['cat', 'dog']['dolphin','cougar', 'whale']]

どうすればこれを達成できますか?

4

5 に答える 5

3
ar =  ['x', 'cat', 'dog', 'x', 'dolphin', 'cougar', 'whale']
p ar.chunk{|el| el == 'x'}.each_slice(2).map{|el| el.last.last}
#=> [["cat", "dog"], ["dolphin", "cougar", "whale"]]

ほとんどの作業は、メソッドの不要な副次的な結果を切り捨てるchunkことです。

于 2013-05-09T22:53:13.827 に答える
3

Enumerable#chunk行く方法です。nil不要なチャンクを削除するために使用できます。

arr = ['x','cat', 'dog', 'x', 'dolphin', 'cougar', 'whale']

arr.chunk{ |e| e != 'x' || nil }.map(&:last)
#=> [["cat", "dog"], ["dolphin", "cougar", "whale"]]
于 2013-05-10T01:16:03.773 に答える
2

古き良きEnumerable#reduceものは非常に多くのことに便利です:

def split_array_by_item(array, item)
  array.reduce([]) do |memo, x|
    memo.push([]) if (x == item) || memo.empty?
    memo[-1].push(x) unless x == item
    memo
  end
end

a = ['x', 'cat', 'dog', 'x', 'dolphin', 'cougar', 'whale'] 
split_array_by_item(a, 'x') # => [["cat", "dog"], ["dolphin", "cougar", "whale"]] 

[編集]また:

def split_array_by_item(array, item)
  array.chunk{|x|x==item}.reject(&:first).map(&:last)
end
于 2013-05-09T22:45:55.757 に答える
0

Ruby 2.0 以降では、slice_beforeメソッドまたは 2.2 以降ではslice_whenメソッドが適切な解決策です。

ただし、生成された各配列の最初の要素「x」を削除する必要があります。

ary =  ['x', 'cat', 'dog', 'x', 'dolphin', 'cougar', 'whale']

ary.slice_before{|e| e=='x'}.map{|t| t.drop(1)}

#==> [["cat", "dog"], ["dolphin", "cougar", "whale"]]

ary.slice_when{|i,j| j=='x'}.map{|t| t.drop(1)}

#==> [["cat", "dog"], ["dolphin", "cougar", "whale"]]
于 2016-03-16T20:54:09.320 に答える