2016-07-13 7 views
-1

Ich versuche, eine Methode zu erstellen, die bubble-sort verwendet, um ein kleines Array in numerischer Reihenfolge zu sortieren. Diese Methode akzeptiert zwei Argumente, ein Array und ein Verfahren:So verwenden Sie einen Block als Methodeneingabe

def bubble_sort_by(arr) 
    while(true) 
     counter = 0 
     for i in 0...(arr.size-1) 
      if yield (arr[i], arr[i+1]) > 0 
       saved = arr[i] 
       arr[i] = arr[i+1] 
       arr[i+1] = saved 
       counter += 1 
      end 
     end 
     if (counter == 0) 
      break 
     end 
    end 

    print arr 
end 

bubble_sort_by([4,3,78,2,0,2]) do |left,right| 
    return left - right 
end 

Die sortierten Array

[0,2,2,3,4,78] 

sein sollte Derzeit bin ich mit Ruby-Version 2.3.0p0.

Ich bekomme immer einen Syntaxfehler, wenn ich versuche, diesen Code auszuführen.

+0

Bitte lesen Sie "[fragen]" einschließlich der verlinkten Seiten und "[mcve]". Wenn Sie nach einem Syntaxfehler in Ihrem Code fragen, hilft es * wirklich *, wenn Sie sagen, was es ist. Das hilft uns, dir zu helfen. –

+0

Ich möchte ein paar Dinge über Ihren Code erwähnen, der nichts mit Ihrer Frage zu tun hat. 1. "loop do" wird dem etwas künstlichen "while (true)" vorgezogen. Zum einen behandelt [Kernel # loop] (http://ruby-doc.org/core-2.2/Kernel.html#method-i-loop) die Ausnahme 'StopInteration', eine nützliche Eigenschaft, die Sie kennenlernen werden rechtzeitig. 2. Iteratoren mit Blöcken werden den "for" -Schleifen vorgezogen (die niemand benutzt): '(arr.size-1) × {| i | ...} '. (Forts.) ... –

+0

... 3. Ruby erlaubt Ihnen, * parallele Zuweisung * (auch bekannt als * multiple Zuweisung *) zu verwenden, um zwei Werte des Arrays ohne die Verwendung einer temporären Variable (Ihre 'gespeicherte') zu vertauschen:' arr [i], arr [i + 1] = arr [i + 1], arr [i] '. (Forts.) ... 4. Einige bevorzugen "break if counter == 0" zu Ihrem 3-Linien-Konstrukt. (Oder 'break if counter.zero? ', Um gegen die versehentliche Verwendung eines einzelnen Gleichheitszeichens zu schützen.) 5. Wenn der Hauptzweck einer Methode darin besteht, einen Wert (hier ein sortiertes Array) zu berechnen, mit einer print-Anweisung innerhalb der Methode macht die Methode weniger vielseitig. Besser, es zu verschieben und 'pubes bubble_sort_by (arr)' zu schreiben. –

Antwort

1

Dies ist die feste Version:

def bubble_sort_by(arr) 
    while(true) 
     counter = 0 
     for i in 0...(arr.size-1) 
      if yield(arr[i], arr[i+1]) > 0 
       saved = arr[i] 
       arr[i] = arr[i+1] 
       arr[i+1] = saved 
       counter += 1 
      end 
     end 
     if (counter == 0) 
      break 
     end 
    end 

    print arr 
end 

bubble_sort_by([4,3,78,2,0,2]) do |left,right| 
    left - right 
end 

Wie man sehen kann, hatte es zwei Probleme:

  1. Der Raum ein yield - im Grunde der Raum Extra war, weil es nicht das vorging Zahlen in der Klammer als Argumente;
  2. Die return im Block - Sie möchten nicht, dass der Block den Wert explizit zurückgibt, Sie müssen es in bubble_sort_by ausgewertet werden und dann wird das Ergebnis im Kontext dort verwendet.
Verwandte Themen