簡體   English   中英

行的備用格式,每組中有多行

[英]Alternate formatting of rows, with multiple rows in each set

我正在用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

我想以交替方式設置每組類別的格式。 因此,第一組將是粗體,然后第二組將不是粗體,第三組將是粗體,第四組將不如此。

在這種情況下,我將得到以下格式化的輸出: 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

您可以使用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
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_", "", "", "", ""]轉換為不斷重復的枚舉器。

然后,只需將list每個元素映射到新值即可,在該新值中,“ T”字符串前面帶有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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM