2

私は配列を持っています:

a = [[676, "/"], [679, "/", 680, "/"], [4, "3.7", "111.55", "/"], [668, "/"], [681, "/", 682, "/"]]

次のような出力が必要です。

a = [[676], [679], [680], [4, "3.7", "111.55"], [668], [681], [682]]

このようなことを試してみました:

a.flatten.join(",").split("/")

次のようなものが得られます。

["676,", ",679,", ",680,", ",4,3.7,111.55,", ",668,", ",681,", ",682,"]
4

4 に答える 4

4

必要なものは次のとおりです。

a.flatten.chunk { |x| x != '/' }.select(&:first).map(&:last)  
#=> [[676], [679], [680], [4, "3.7", "111.55"], [668], [681], [682]]

または:

a.flatten.chunk { |x| x != '/' }.map { |bool, arr| arr if bool }.compact
于 2012-08-10T06:44:58.340 に答える
2

それは少し厄介で (smathy が厄介な問題だと言ったように)、おそらくあまり柔軟に変更することはできませんが、

 arr = [[676­, "/"],­ [679,­ "/", 680, "/"],­ [4, "3.7"­, "111.­55", "/"],­ [668,­ "/"],­ [681,­ "/", 682, "/"]]­
arr.i­nject([]) do |res,­ el|
  tmp = []
  el.ea­ch do |inne­r_el|
    if inner­_el == "/"
      res << tmp
      tmp = []
    else
      tmp << inner­_el
    end
  end
  res
end
于 2012-08-10T06:18:43.277 に答える
1

元の配列は重要ではないようですので、以下flattenを単純化するために使用できますinject:

a.flatten
 .inject([[]]) { |m, e| e == '/' ? m.push([]) : m.last.push(e); m }
 .reject(&:empty?)

rejectfinalから漂遊空の配列を取り除くには、 final が必要です"/"

于 2012-08-10T06:35:57.113 に答える
1

使ってみて

a.map!{|x| x.reject{|x| x=='/'}}

これは動作します..

于 2012-08-10T06:55:36.567 に答える