Domanda

Ho bisogno di un metodo scritto in Ruby, che calcola Variazioni. Ho già scritto in Java, ma come io sono nuovo a Ruby, c'è solo qualcosa che mi manca in merito all'attuazione Ruby.

Il metodo è dovuto inviarci per fare questo:
Metodo (1, "01") => [ "0", "1"]
Metodo (2, "01") => [ "00", "01", "10", "11"] ... così si ottiene l'idea.

Nota: nel impl Ruby, io do paralms come questo: il metodo (2, [ "0", 1" ]), ma non è un problema

.

Il mio 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;
}

E va bene lavoro. Ma questa è la mia implementazione di Ruby:

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 questo io continuo a ricevere il messaggio di errore test.rb: 10: in `Variation ':. Non può convertire nullo in String (TypeError)

È stato utile?

Soluzione

In Ruby, crescere automaticamente secondo necessità gli array. Quindi, cambiare la vostra inizializzazione matrice da:

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

a

array = []

Per enumerare su ogni carattere di una stringa, anziché

for i in arrayOfString do

fare questo:

arrayOfString.each_char do |i|

Il risultato finale:

#!/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"]

each_char è in Ruby> = 1.8.7, oppure si può ottenere dal backport gemma .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top