Friday, April 11, 2008

Array.sort en Ruby


La propiedad SORT para los Arrays en Ruby, funciona muy bien, pero solo cuando se trata de valores numéricos...Pero que pasa con los alfanuméricos? Pues falla miserablemente...

Lo que debemos hacer, es nuestro propio algoritmo de burbuja y convertir los valores a enteros antes del ordenamiento.

Vean el código fuente y la imagen del resultado...


$Files = Array.new

$Files = ["1.txt","10.txt","2.txt","3.txt","4.txt","11.txt",
"12.txt","5.txt","6.txt","7.txt","8.txt","9.txt"]

$count = 0
$counter = 0

$Files.sort!

for file in $Files
puts file
end

puts "--------------------------"

for file in $Files
$count = 0
for do_file in $Files
if $Files[$count].to_i > $Files[$counter].to_i
$aux = $Files[$count]
$Files[$count] = $Files[$counter]
$Files[$counter] = $aux
end
$count += 1
end
$counter += 1
end

for file in $Files
puts file
end



Como pueden ver, el primero es el SORT de Ruby y el segundo es mi algoritmo -;)

Saludos,

Blag.

5 comments:

Rodolfo said...

Hola, llegué a tu blog buscando cosas de Ruby. Quería comentarte que el swap entre dos variables lo podés hacer con a,b = b,a.
Saludos

Randolph Carter said...

Hay una cosa que pasa con los lenguajes, tanto los hablados como los de programación, y es que cuando estás aprendiendo uno tiendes a pensar en el tuyo propio para crear frases o trozos de código, y luego tiendes a traducir todo antes de entenderlo.

Bueno, antes de explicar a que viene esta milonga comentarte que no malinterpretes mis palabras si parece algo como una ataque personal, es solo que me estoy dejando llevar por la impresión.

Bien, volviendo al tema lenguaje nuevo que se aprende, pues exactamente eso es lo que pasa en este post, has intentado representar tus pensamientos en PHP (o ASP o algún otro parecido, y digo PHP por esa propension al simbolo del dolar) en una función y luego lo has pasado a Ruby, cuando si hubieras pensado directamente en ruby ya habrías visto que algo no va bien ahí. Hay una serie de sintomas que me dicen que necesitas más horas de "enrubiamiento":

1. el bucle "for", no lo utilices casi nunca
2. olvidate de los contadores, en ruby no te hacen falta, y por tanto del PHPero += 1
3. las variables auxiliares son para enseñar a los niños a programar
4. las variables no necesitan $ delante, esto supongo que será un pequeño fallo.
5. En ruby no hay que declarar un array con Array.new, el hecho de hacer [] ya es como declarar Array.new

Ahora, para que veas que facil habría sido si hubieses pensado en ruby, te pongo aquí una versión reducida de tu Array.sort (voy a poner solo el método)

sort!{|a,b| a.to_i <=> b.to_i}

Esto son 14 líneas resumidas en 1 (14 porque cuento la declaración de los contadores). En cosas como esta es donde reside la magia de Ruby y por eso me gusta tanto.:

Estaría bien que le echaras un ojo a esta guía:
http://poignantguide.net/ruby/
y también el libro online gratuito de pragmatic programmers
http://www.ruby-doc.org/docs/ProgrammingRuby/

Suerte con tus futuros "ruby" experimentos.

Deica!

Alvaro "Blag" Tejada Galindo said...

Muchas gracias por los comentatios, realmente los agradezco -:)

La verdad, aunque me encanta Ruby, definitivamente no soy ningún experto y aún me quedan muchas cosas por aprender.

En realidad, hice el programa inicialmente en ABAP y no en PHP o ASP...Lo del símbolo del $, es porque en realidad me gusta programarlo así, puesto que diferencio las variables normales de las constantes -:D

He leído muchos libros sobre Ruby, pero a veces cuando un programa en varios lenguajes, tiende a mezclarlos y utilizar formatos de unos en otros -;)

Saludos,

Blag.

Randolph Carter said...

Creo que todos hemos tenido que vivir ese tipo de transición, pero el hecho de que ruby sea tan diferente hace que programar en ruby a la vez que se hace en otros lenguajes sea muy muy difícil, y por eso hay ese dicho por ahí de que una vez empiezas en ruby ya no puedes dejarlo.

El tema del dólar delante de variables es algo que debes quitarte, porque en ruby una variable así pasa a ser global, o sea, accesible durante la ejecución de todo el programa. Es una de las "bad practices" más extendidas del mundo PHP y puede llevarte a más de una sorpresa que te podrías haber ahorrado.

Y bueno, aún estás a tiempo de evitar ser infectado por el virus Ruby y no volver nunca a saber porgramar en PHP, ASP y similares sin preguntarte "¿como se hacía un "closure" en PHP?"

Saludos y suerte

Alvaro "Blag" Tejada Galindo said...

Jajaja...Voy a tomar muy en cuenta todas tus recomendaciones para mis futuros desarrollos en Ruby -:)

Aunque dudo mucho que deje de programar en PHP, Flex o ABAP... -;)

Saludos,

Blag.