2010-11-23 24 views
8

Por ejemplo, me gustaría convertir en "hello"list(104, 101, 108, 108, 111) o list("h", "e", "l", "l", "o")¿Cómo convierto una cadena en una lista en Io?

Hasta ahora he creado una lista vacía, solía foreach y adjuntas cada elemento a la lista a mí mismo, pero eso no es realmente una manera concisa que hacer eso.

+0

Usted ** ** realmente no quiere saber lo que tiene que pasar para convertir una cadena en una lista en el hel-language. ;-) –

+0

lol .. si alguna vez creo un lenguaje de programación bastante serio, prometo llamarlo Hel :) – Jakob

+0

Fuera de tema pero relevante para las preguntas de Io aquí en SO. Te he revertido las ediciones de etiquetas que hiciste recientemente porque 'iolanguage' es la etiqueta canónica para Io. – draegtun

Respuesta

2

Una forma sería utilizar expresiones regulares complemento:

#!/usr/bin/env io 

Regex 

myList := "hello" allMatchesOfRegex(".") map (at(0)) 

Pero estoy seguro de que debe haber otros (y tal vez incluso mejor!) Maneras.


Actualización - re: mi comentario en cuestión. Sería bueno tener algo incorporado en el objeto Secuencia. Por ejemplo:

Sequence asList := method (
    Regex 
    self allMatchesOfRegex(".") map (at(0)) 
) 

# now its just 
myList := "hello" asList 
+0

Esa es una solución creativa, pero no realmente mejor no :) – Jakob

+0

Es mejor que 'foreach' porque ningún gatito^h^h^h^h^h^h^h las variables fueron dañadas o muertas en su construcción :) – draegtun

+1

No parece que mucha gente se pasea por stackoverflow (o en cualquier lugar para el caso). +1 por el entusiasmo :) – Jakob

5

Mi propia sugerencia:

Sequence asList := method(
    result := list() 
    self foreach(x, 
    result append(x) 
) 
) 

no lo he probado en cuanto al rendimiento, pero evitando la expresión regular debe dar cuenta de algo.

+0

Sí 'foreach' será mucho más eficiente. Sin embargo, es menos conciso. ¿Afortunadamente hay una solución de desempeño conciso? – draegtun

+2

Algo similar a este enfoque se usa en una de las pruebas (ver byteList): https: // github.com/stevedekorte/io/blob/master/libs/iovm/tests/correctness/SequenceBitTest.io – dstnbrkr

+1

Un poco de aceleración: 'result: = list() preallocateToSize (self-size)' – Tino

3

Otra muy bien conciso, pero lamentablemente todavía más lenta que la solución es foreach:

Sequence asList := method (
    Range 0 to(self size - 1) map (v, self at(v) asCharacter) 
) 
Cuestiones relacionadas