2016-03-27 10 views
2

Ich beschloss, etwas Ruby zu lernen und versuchte eine Insertion-Version in Ruby (2.3.0). Wenn jedoch mein Programm überprüft, um die Position zu sehen und ob Werte ausgetauscht werden sollen, gibt es einen NoMethodError für '>' zurück. Insbesondere:NoMethodError in Ruby mit Vergleichsstatement

./rubyInsertSort.rb:28:in `block in sort': undefined method `>' for 1..4:Range (NoMethodError) 
from ./rubyInsertSort.rb:26:in `each' 
from ./rubyInsertSort.rb:26:in `sort' 
from ./rubyInsertSort.rb:22:in `main' 
from ./rubyInsertSort.rb:40:in `<main>' 

Hier ist der Code für die Sortiermethode:

def sort(input, valueAmount) 
    for i in 1..valueAmount 
    j = i 
    while j > 0 and input[j - 1] > input[j] 
     input[j], input[j - 1] = input[j - 1], input[j] 
     j += -1   
    end 
    end 

    #Output loop 
    for i in 1..valueAmount 
    puts "Sort Value #{i} = #{input[i]}" #Outputs the sorted array to the console 
    end 
end 

Ich weiß, das wahrscheinlich etwas trivial und ist wirklich einfach, aber ich kann nicht eine Frage hier oder an anderer Stelle mit einem finden Lösung und jede mögliche Hilfe würden geschätzt!

+0

Es funktioniert gut zu mir ... Probieren Sie es mehr ruby-weise 'tun (1..valueAmount) .each do | i | 'und ob es funktioniert –

+0

Bitte geben Sie die Werte von' input' und 'valueAmount' an, die diesen Fehler verursachen. –

+0

valueAmount ist ein ganzzahliger Wert, der die Anzahl der zu speichernden Werte speichert. Die Eingabe ist ein Array der Größe [valueAmount], in der die Werteliste gespeichert wird. In diesem Fall waren die Eingabewerte: 2, 7, 4 und 9 –

Antwort

1

Geändert Ihre Version

def sort(input, valueAmount) 
    for i in 1...valueAmount # Added a dot 
    j = i 
    while j >= 0 and input[j - 1] > input[j] # >= instead of > 
     input[j], input[j - 1] = input[j - 1], input[j] 
     j += -1 
    end 
    end 

    #Output loop 
    for i in 0...valueAmount # Added a dot 
    puts "Sort Value #{i} = #{input[i]}" #Outputs the sorted array to the console 
    end 
end 

Und hier meine Version (ohne Ausgabe)

ist
def insertion_sort!(ary) 
    return ary if ary.size < 2 
    1.upto(ary.size - 1) do |i| 
    i.downto(0) do |j| 
     break if ary[j - 1] <= ary[j] 
     ary[j - 1], ary[j] = ary[j], ary[j - 1] 
    end 
    end 
    ary 
end 
+0

Ihre Lösung scheint für mich funktioniert zu haben, danke für die Hilfe! –

Verwandte Themen