2016-02-14 46 views
-2

我寫了方法,將用戶輸入(整數)數組從低到高排序並反向排序。代碼看起來像:Ruby中的排序方法

def alphabetize(arr, rev=false) 
    arr.sort! 
    if rev==true 
    arr.reverse! 
    end 
    return arr 
end 

puts "enter your numbers with 'space' between them" 
text = gets.chomp 
numbers = text.split(" ") 

numbers.each do |element| 
    element.to_i 
end 
puts alphabetize(numbers) 

我第一次只嘗試數字從0到9,並且方法已經正確工作。但後來我試圖輸入數字像1112,11,22和排序程序後,我得到了像這樣的結果「11 1112 22」。在此之後,我試圖改變這樣的代碼:

def alphabetize(arr, rev=false) 
    arr.sort!{|a, b| a.to_i <=> b.to_i} 
    if rev==true 
    arr.reverse! 
    end 
    return arr 
end 

puts "enter your numbers with 'space' between them" 
text = gets.chomp 
numbers = text.split(" ") 
puts alphabetize(numbers) 

而這樣一來我的代碼工作的11,1112,22產生我所期望的結果正確和排序輸入:「11,22,1112」。看起來我已經解決了這個問題,但我真的很想理解第一版和第二版代碼之間的區別。爲什麼方法排序以不同的方式工作?

回答

0

看起來像在第一個地方,你仍然比較字符串,而不是整數。

事實上,擺在首位你不元素轉換爲整數:

numbers.each do |element| 
    element.to_i 
end 

下面的腳本不與​​整數數組替換字符串。

+0

但是爲什麼?我認爲,「每個」與「to_i」將我的數組的每個元素轉換爲整數,我錯了嗎? –

+0

該方法是正確的,但每個你只是採取每一個元素並將其轉換,但沒有替換正在做 –

+0

你也應該提出修正,以便你的答案被接受。我知道你先回答。 +1的努力。 –

3

each不會替換數組中的元素 - 它只是簡單地返回數組本身(沒有更改)。

你可能更願意使用map

numbers = numbers.map do |element| 
    element.to_i 
end 

或者更好,但使用map!,這實際上改變了陣列本身,而不是返回改變陣列:

numbers.map! do |element| 
    element.to_i 
end 

你也可以使用以下速記:

numbers.map! &:to_i 
+0

哦,現在我明白問題了,非常感謝! –