Frage

Ich brauche eine Methode in Ruby geschrieben, die Variationen berechnet. Ich habe es schon in Java geschrieben, aber wie ich bin neu zu Ruby gibt es nur etwas, das ich über die Ruby-Implementierung bin fehlt.

Das Verfahren ist suposed dies zu tun:
Verfahren (1 "01") => [ "0", "1"]
Verfahren (2, "01") => [ "00", "01", "10", "11"] ... so dass Sie die Idee.

Hinweis: in der Ruby-impl, ich gebe paralms wie folgt aus: Verfahren (2, [ "0", 1" ]), aber das ist kein Problem

.

Meine Java impl:

public static List<String> Variations(int strength, String usableChars) {
    List<String> list = 
        new ArrayList<String>((int) Math.pow(usableChars.length(), strength));

    if (strength == 0) {
        list.add("");
    } else {
        List<String> l = Variations(strength - 1, usableChars);
        for (char c : usableChars.toCharArray()) {
            for (String s : l) {
                list.add(c + s);
            }
        }
    }
    return list;
}

und es funktioniert gut. Aber das ist meine Ruby-Implementierung:

def Variation (strength, arrayOfString)
    array = Array.new(arrayOfString.size**strength)

    if strength == 0
        array << ""
    else
        a = Variation(strength-1, arrayOfString)
        for i in arrayOfString do
            for j in a do
                array << (i + j)
            end
        end
    end
    return array 
end

In dieser i erhalte Fehlermeldung test.rb: 10: in `Variation ':. Kann nicht gleich Null in String konvertieren (Typeerror)

War es hilfreich?

Lösung

In Ruby-Arrays wächst automatisch je nach Bedarf. So aus dem Array Initialisierung ändern:

array = Array.new(arrayOfString.size**strength)

array = []

Um jedes Zeichen in einer Zeichenkette aufzählen über, anstelle von

for i in arrayOfString do

Sie folgendermaßen vor:

arrayOfString.each_char do |i|

Das Endergebnis:

#!/usr/bin/ruby1.8

def Variation (strength, arrayOfString)
  array = []
  if strength == 0
    array << ""
  else
    a = Variation(strength - 1, arrayOfString)
    arrayOfString.each_char do |i|
      for j in a do
        array << (i + j)
      end
    end
  end
  return array
end

p Variation(2, '01')    # => ["00", "01", "10", "11"]

ist each_char in Ruby> = 1.8.7, oder Sie können es von der updates gem zu bekommen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top