2015-04-21 75 views
1

我試圖從Array中刪除最小和最大元素對,並將它們存儲在第二個元素中。有沒有更好的方法來做到這一點,或者我不知道有關Ruby方法可以完成這樣的事情?將元素插入到新陣列中,然後從舊陣列中刪除一些元素被忽略

這裏是我的代碼:

nums = [1, 2, 3, 4, 5, 6] 
pairs = []; for n in nums 
    pairs << [n, nums.last] 
    nums.delete nums.last 
    nums.delete n 
end 

當前的結果:

nums 
#=> [2, 4] 
pairs 
#=> [[1, 6], [3, 5]] 

預期結果:

nums 
#=> [] 
pairs 
#=> [[1, 6], [2, 5], [3, 4]] 
+4

一個好的一般原則是不要修改你正在迭代的集合。 –

+0

感謝您的幫助!還有一件事:爲什麼這樣做不好,我仍然不完全確定爲什麼某些數字會被跳過。 –

回答

5

假設nums排序並可以修改,我很喜歡這種方式,因爲它有一個關於它的機械感覺:

pairs = (nums.size/2).times.map { [nums.shift, nums.pop] } 
    #=> [[1, 6], [2, 5], [3, 4]] 
nums 
    #=> [] 

我看到@Drenmi有同樣的想法使用shiftpop

如果你不想修改nums,你當然可以在副本上操作。

+1

我喜歡你的代碼,因爲OP也希望它清除原始數組,所以請更新你的答案,顯示'nums'爲空數組,以便OP瞭解最後發生了什麼。 1+ –

+2

@Gagan,謝謝。我的編輯地址是否指向?我有點困惑,因爲我不知道Ethan的「輸出」是他得到的錯誤答案還是他想要的結果。我認爲這是前者。 –

+1

@CarySwoveland:我最初將它解釋爲期望的輸出(帶有一些拼寫錯誤),但是在運行他的代碼之後,我意識到這是他的代碼生成的。我將兩種情況都包含在我的回答中,但是你打敗了我。 – Drenmi

1

歷數了一個多Array同時刪除它的內容一般不advisible。這裏有一個替代的解決方案:

nums = *(1..6) 
#=> [1, 2, 3, 4, 5, 6] 

pairs = [] 
#=> [] 

until nums.size < 2 do 
    pairs << [nums.shift, nums.pop] 
end 

pairs 
#=> [[1, 6], [2, 5], [3, 4]] 
+1

我認爲OP希望'nums'在最後是空的。 – jcm