Pregunta

I necesitan un método escrito en Ruby, que calcula variaciones. Ya he escrito en Java, pero como soy nuevo en Rubí, hay algo que me falta por la aplicación Ruby.

El método se suposed para hacer esto:
método (1, "01") => [ "0", "1"]
método (2, "01") => [ "00", "01", "10", "11"] ... para que pueda obtener la idea.

nota: en el impl Ruby, i dar paralms como este: método (2, [ "0", 1" ]), pero eso no es un problema

.

Mi impl Java:

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

Y está bien de trabajo. Pero esta es mi aplicación 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

En este sigo recibiendo mensajes de error test.rb: 10: Variación en ` ':. No se puede convertir en nula String (TypeError)

¿Fue útil?

Solución

En Ruby, matrices crecen automáticamente según sea necesario. Así que cambiar la matriz de inicialización de:

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

a

array = []

Para enumerar más de cada carácter en una cadena, en lugar de

for i in arrayOfString do

hacer esto:

arrayOfString.each_char do |i|

El resultado final:

#!/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 está en Rubí> = 1.8.7, o se puede obtener de la backports joya .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top