2015-11-07 65 views
1

我想根據我希望新列表的大小,將一個列表(如[1,2,3,4])均勻分散到不同的列表中,如[1, nil, nil, 2, nil, nil, 3, nil, 4, nil]如何使用間隔符將列表分散出來?

所以 [1, 2, 3, 4]給大小的9名單爲:[1, nil, nil, 2, nil, 3, nil, 4, nil]

而且[1,2,3,4]給大小爲4的名單將是:[1,2,3,4]

我將需要傳播「參差不齊」隔層,應該從左到右 - 看看我的第一個例子。


我在下面回答了我自己的問題。

+0

@theTinMan我得到的,但我試圖分享我的解決方案,我的答案如下。我不在乎人們使用的邏輯,而且這是一個算法問題,很難將你的頭圍繞。但我確實在 –

+1

以下回答我自己的問題。這還算公平。在數組中使用nils看起來像是一個有問題的使用nil,但這是程序員的選擇。 –

+0

@theTinMan我主要是爲了映射它而創建的 - 我試圖在我正在開發的作業規劃器中創建「長期作業」,所以我認爲創建均勻間隔的「工作時段」的最佳方式是創建一個列表並添加空格,所以我認爲這將是一個很好的方式來取得工作時間並將其間隔(在它們映射到到期日之後)。我也製作了寶石,所以你可以將零件從一個零對象改變爲其他的東西(第三個參數,或者spacer:[object])。此外,感謝您歡迎我,但您遲了大約一年:D –

回答

0

我決定把這個寶石:gem install CreamCheese

安裝和要求寶石(require 'CreamCheese')後,就可以攤開與刀的列表。

require 'CreamCheese' 
CreamCheese::Knife.spread [1,2,3,4], 9 #=> [1, nil, nil, 2, nil, 3, nil, 4, nil] 
CreamCheese::Knife.spread [1,2,3,4], 4 #=> [1,2,3,4] 
+0

出於好奇。你爲什麼想做這個?我不知道如何存儲一堆零值可能有多大用處。 – binarymason

+0

@ m8ss我這樣做主要是爲了映射它 - 我試圖在我正在做的作業規劃師中創建「長期任務」,所以我認爲創建均勻間隔的「工作時段」的最佳方式是創建一個列表並添加空格,所以我認爲這將是一個很好的方式來取得工作時間並將其間隔(在它們映射到到期日之後)。我也做了寶石,所以你可以將零件從一個零對象改爲別的東西(第三個參數,或'spacer:[object]') –

+0

所以我使用類似於:'CreamCheese :: Knife.spread([work period,工作時間等],self.days_until_due)。each_with_index.map {| work_period,i | work_period.due_date =(i + 1).days.from_now}'(代碼看起來更好用格式化,而不是全部在一行中:D) –

0

我不會去使用這個gem,因爲它可以在幾行Ruby中解決。不幸的是,你沒有精確地指定你想如何處理傳播不均勻的情況(甚至當每個項目後面跟着相同數量的間隔符時)。

在一個簡單的情況下,甚至蔓延:

# The general case 
spread_array = array.flat_map {|el| [el] + [spacer] * (spread/array.size - 1) 

# An example 
[1, 3].flat_map {|el| [el] + [nil] * 2 } #=> [1, nil, nil, 3, nil, nil] 

如果你想最左邊的元素後添加剩餘的空間,您可以使用此:

# Extra spread goes on the leftmost items 
spread_array = array.flat_map.with_index do |el, i| 
    [el] + [spacer] * (spread/array.size - (i < spread % array.size ? 0 : 1)) 
end 
+0

如果你看看我的例子,列表大小爲9,我的意思是從左到右添加剩餘空間,這通常會發生在我正在做的事情上。我編輯了這個問題來澄清這一點。 –

+0

@ penne12我已經修改了答案,以包含您的具體情況。 – thomasfedb

+0

太棒了!謝謝。 –

相關問題