0

Rubyでプログラミングしています。

次の 2D 配列があるとします。

list = [
  ["T1", "Cat 1"],
  ["T2", "Cat 2"],
  ["T3", "Cat 3"],
  ["T4", "Cat 4"],
  ["T5", "Cat 1"],
  ["T6", "Cat 2"],
  ["T7", "Cat 3"],
  ["T8", "Cat 4"],
  ["T9", "Cat 1"],
  ["T10", "Cat 2"],
  ["T11", "Cat 3"],
  ["T12", "Cat 4"],
]

カテゴリのリストもあります:

cat = ["Cat 1", "Cat 2", "Cat 3", "Cat 4"]
cat_count = cat.count

boldテキストを太字にフォーマットするメソッドもあります。ここでは簡単にするために、以下のメソッドを使用します。

def bold(text)
  'b_' << text
end

カテゴリの各セットを交互にフォーマットしたいと思います。したがって、最初のセットは太字、次に 2 番目のセットは太字、3 番目のセットは太字、4 番目のセットは太字、というようになります。

この場合、次の形式の出力が得られます。 T1 T2 T3 T4 T5 T6 T7 T8 T9 T10 T11 T12

次のルビー出力が期待されます。

["b_T1", "Cat 1"]
["b_T2", "Cat 2"]
["b_T3", "Cat 3"]
["b_T4", "Cat 4"]
["T5", "Cat 1"]
["T6", "Cat 2"]
["T7", "Cat 3"]
["T8", "Cat 4"]
["b_T9", "Cat 1"]
["b_T10", "Cat 2"]
["b_T11", "Cat 3"]
["b_T12", "Cat 4"]

現時点では、次のコードがありますが、これはまったく Rubyist に見えません。このコードの改善にご協力ください。

cat_increment = 0
switch = 1

list.map do |l|
  cat_increment+=1
  entry = switch ? [bold(l.first), l.second] : l
  if cat_increment == cat_count
    switch = switch ? nil : 1
    cat_increment = 0
  end 
  entry
end
4

2 に答える 2

3

with_index配列分解、およびいくつかの数学を使用できます。

list.map.with_index do |(title, category), index|
  if index % (2 * cat_count) < cat_count
    [bold(title), category]
  else
    [title, category]
  end
end
于 2016-01-13T22:00:38.640 に答える
1
enum = [*["b_"]*cat.size, *[""]*cat.size].cycle
  #=> #<Enumerator: ["b_", "b_", "b_", "b_", "", "", "", ""]:cycle>
list.map { |t,c| [enum.next+t, c] }
  #=> [["b_T1", "Cat 1"], ["b_T2", "Cat 2"], ["b_T3", "Cat 3"], ["b_T4", "Cat 4"],
  #    ["T5", "Cat 1"], ["T6", "Cat 2"], ["T7", "Cat 3"], ["T8", "Cat 4"],
  #    ["b_T9", "Cat 1"], ["b_T10", "Cat 2"], ["b_T11", "Cat 3"], ["b_T12", "Cat 4"]] 

Array#cycle["b_", "b_", "b_", "b_", "", "", "", ""]は、配列を無限に繰り返す列挙子に変換するために使用されます。

次に、「T」文字列の前に(または)listの次の要素が追加された新しい値に の各要素をマッピングするだけです。enum"b_"""

この列挙子を使用して、cat.size要素の各グループと交互になる "T" プレフィックスを追加することにしましたが、より一般的な方法はインデックスを使用することです。

list.map.with_index { |(t,c),i| [(i/4).even? ? "b_"+t : "t", c] } 
  #=> [["b_T1", "Cat 1"], ["b_T2", "Cat 2"], ["b_T3", "Cat 3"], ["b_T4", "Cat 4"],
  #    ["T5", "Cat 1"], ["T6", "Cat 2"], ["T7", "Cat 3"], ["T8", "Cat 4"],
  #    ["b_T9", "Cat 1"], ["b_T10", "Cat 2"], ["b_T11", "Cat 3"], ["b_T12", "Cat 4"]] 

Ruby 2.3.1 では、次のように記述できます。

list.each_with_index { |(t,_),i| print "#{ (i/4).even? ? t.boldify : t } " }

T1 T2 T3 T4 T5 T6 T7 T8 T9 T10 T11 T12

于 2016-01-14T06:26:14.967 に答える