在值对之前剪切数组元素

时间:2019-02-03 06:30:28

标签: arrays ruby remove-if

具有数组“ a”,我想在数组“ a”内寻找一对值。 “ 02”后跟“ 10”,如果找到,我想创建2个新数组,一个 从“ 02”,“ 10”开始,另一个在“ 02”,“ 10”之后的开始3个位置。

a = ["11", "45", "01", "01", "02", "00", "10", "4C", "02", "10", "00", "42", "00", "00", "26"]

如果我分别查看02和10的索引,我分别得到4和6,但是对“ 02”,“ 10”的索引是8。

irb(main)> a.index("02")
=> 4
irb(main)> a.index("10")
=> 6

所需的输出如下:

b = ["02", "10", "00", "42", "00", "00", "26"]

c = ["00", "00", "26"]

我该怎么做?

2 个答案:

答案 0 :(得分:2)

def find_em(a)
  i = (a.size-1).times.find { |i| [a[i], a[i+1]] == ["02", "10"] }
  i.nil? ? nil : [a[i..-1], a[i+4..-1] || []]
end

find_em(a)
  #=> [["02", "10", "00", "42", "00", "00", "26"], ["00", "00", "26"]] 

find_em ["10", "4C", "02", "10", "00", "42"]
  #=> [["02", "10", "00", "42"], []] 

find_em ["10", "4C", "02", "10"]
  #=> [["02", "10"], []] 

find_em ["10", "4C", "10", "00", "42"]
  #=> nil 

find_em []
  #=> nil 

答案 1 :(得分:1)

要使其在["02", "10"]出现更多情况下起作用,有条件地从@Cary Swoveland偷来了答案:)

def split_strange(ary)
  res = []
  (ary.size - 1).times do |i|
    res << [ary[i..-1], ary[i+4..-1]] if [ary[i], ary[i+1]] == ["02", "10"]
  end
  return res.flatten(1) # or whathever
end

因此,它还可以处理:

k = ["02", "10", "02", "10", "00", "42", "00", "00", "26"]
split_strange(k)
#=> [["02", "10", "02", "10", "00", "42", "00", "00", "26"], ["00", "42", "00", "00", "26"], ["02", "10", "00", "42", "00", "00", "26"], ["00", "00", "26"]]


替代方法,但只出现一次:

def split_strange_2(ary)
  tmp = ary.slice_when { |a, b|  a == "02" and b == "10" }.to_a
  res = tmp.last.unshift tmp.first.last
  return res, res[4..-1] || [] if tmp.size == 2
end

split_strange_2(a)
#=> [["02", "10", "00", "42", "00", "00", "26"], ["00", "00", "26"]]