Ruby - 从数组中收集相同数字到数组数组

时间:2017-04-06 06:00:20

标签: arrays ruby refactoring

我创建了一个非常难看的脚本来从数组中收集相同的数字。我不认为这是一种非常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

4 个答案:

答案 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_whileEnumerable#slice_whenying 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]]