我创建了一个非常难看的脚本来从数组中收集相同的数字。我不认为这是一种非常Ruby的方式:)任何人都可以提供更清洁的解决方案吗?
read()
输出:
stdio.h
请注意,在主数组中,相同的数字总是一个接一个地出现。
所以我不会有像这样的主数组 - ar = [5, 5, 2, 2, 2, 6, 6]
collections = []
collect_same = []
while ar.length > 0
first = ar.values_at(0).join.to_i
second = ar.values_at(1).join.to_i
if ar.length == 1
collect_same << ar[0]
collections << collect_same
break
else
sum = ar.values_at(0, 1).inject {|a,b| a + b}
if second == first
p collect_same << ar[0]
ar.shift
else
collect_same << ar[0]
collections << collect_same
collect_same = []
ar.shift
end
end
end
p collections
答案 0 :(得分:6)
使用chunk_while
:
[5, 5, 2, 2, 2, 6, 6].chunk_while(&:==).to_a
#=> [[5, 5], [2, 2, 2], [6, 6]]
Ruby之前的2.3:
[5, 5, 2, 2, 2, 6, 6].each_with_object([]) do |e, acc|
acc.last && acc.last.last == e ? acc.last << e : acc << [e]
end
#=> [[5, 5], [2, 2, 2], [6, 6]]
答案 1 :(得分:5)
如果你想在没有订单的情况下这样做:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<!DOCTYPE html>
<html>
<head></head>
<body>
<div data-background="https://cdn.pixabay.com/photo/2017/04/04/14/23/peacock-2201428_960_720.jpg"></div>
<div data-background="https://cdn.pixabay.com/photo/2013/07/12/18/59/peacock-154128_960_720.png"></div>
</body>
</html>
答案 2 :(得分:3)
[5, 5, 2, 2, 2, 6, 6].slice_when(&:!=).to_a
#=> [[5, 5], [2, 2, 2], [6, 6]]
或许可以说Enumerable#chunk_while和Enumerable#slice_when是ying and yang。
在Ruby v2.3之前,可能会写
[5, 5, 2, 2, 2, 6, 6].chunk(&:itself).map(&:last)
在v2.2之前,
[5, 5, 2, 2, 2, 6, 6].chunk { |n| n }.map(&:last)
答案 3 :(得分:0)
只是另一个oneliner
arr = [5, 5, 2, 2, 2, 6, 6]
arr.uniq.map {|e| [e]*arr.count(e) }
# => [[5, 5], [2, 2, 2], [6, 6]]