numeros metodos manejo ejemplos crear conversiones cadenas bidimensionales arreglos ruby arrays

metodos - ¿Cómo convierto una cadena de Ruby con corchetes a una matriz?



metodos en ruby ejemplos (5)

Me gustaría convertir la siguiente cadena en una matriz / matriz anidada:

str = "[[this, is],[a, nested],[array]]" newarray = # this is what I need help with! newarray.inspect # => [[''this'',''is''],[''a'',''nested''],[''array'']]


Para una risa:

ary = eval("[[this, is],[a, nested],[array]]".gsub(/(/w+?)/, "''//1''") ) => [["this", "is"], ["a", "nested"], ["array"]]

Descargo de responsabilidad: definitivamente no deberías hacer esto ya que eval es una idea terrible, pero es rápido y tiene el efecto secundario útil de lanzar una excepción si tus matrices anidadas no son válidas.


Parece una tarea básica de análisis. En general, el enfoque que va a querer tomar es crear una función recursiva con el siguiente algoritmo general

base case (input doesn''t begin with ''['') return the input recursive case: split the input on '','' (you will need to find commas only at this level) for each sub string call this method again with the sub string return array containing the results from this recursive method

La única parte ligeramente astuta aquí es dividir la entrada en un solo '',''. Podrías escribir una función separada para esto que escanearía la cadena y mantendría un recuento de los diapasones abiertos, cerrados hasta ahora. Luego solo divide las comas cuando el conteo sea igual a cero.


Realice una función recursiva que tome la cadena y un desplazamiento entero, y "lea" una matriz. Es decir, que devuelva una matriz o cadena (que ha leído) y un desplazamiento entero que apunta después de la matriz. Por ejemplo:

s = "[[this, is],[a, nested],[array]]" yourFunc(s, 1) # returns [''this'', ''is''] and 11. yourFunc(s, 2) # returns ''this'' and 6.

Luego puede llamarlo con otra función que proporcione un desplazamiento de 0, y se asegura de que el desplazamiento final sea la longitud de la cadena.


Obtendrás lo que quieras con YAML.

Pero hay un pequeño problema con tu cadena. YAML espera que haya un espacio detrás de la coma. Entonces, necesitamos esto

str = "[[this, is], [a, nested], [array]]"

Código:

require ''yaml'' str = "[[this, is],[a, nested],[array]]" ### transform your string in a valid YAML-String str.gsub!(/(/,)(/S)/, "//1 //2") YAML::load(str) # => [["this", "is"], ["a", "nested"], ["array"]]


También podría tratarlo como casi-JSON. Si las cadenas realmente son solo letras, como en tu ejemplo, entonces esto funcionará:

JSON.parse(yourarray.gsub(/([a-z]+)/,''"/1"''))

Si pudieran tener caracteres arbitrarios (que no sean [],), necesitarías un poco más:

JSON.parse("[[this, is],[a, nested],[array]]".gsub(/, /,",").gsub(/([^/[/]/,]+)/,''"/1"''))