Bienvenidos sean a este post, hoy hablaremos sobre otra funcion util en arrays como es table.sort la cual hemos visto antes.

Anuncios

Esta se encarga de ordenar el array con una funcion adicional para orientar dicho orden, esta funcion toma dos argumentos y debe devolver true cuando el primer argumento deberia venir primero en el array ordenado, si esta funcion no esta provista sort utiliza la operacion predeterminada menos que, correspondiente al operador <, hay un error comun el cual es intentar ordenar los indices de la tabla, en una tabla los indices forman un conjunto y no tienen orden alguno, si lo queres ordenar primero tenes que copiarlos en un array y luego ordenar el array, veamos el siguiente ejemplo donde suponemos que leemos un archivo fuente y construiremos una tabla que da, por cada nombre de funcion, la linea donde esta funcion es definida, el codigo seria algo asi:

lineas = {
	luaH_set = 10,
	luaH_get = 24,
	luaH_present = 48,
}
Anuncios

Si queremos imprimir estos nombres de funciones en orden alfabetico podemos intentarlo con listar de forma traversal a la tabla con pairs pero los nombres apareceran de forma arbitral, tampoco ordenarlos directamente porque los nombres son las claves de la tabla pero como dijimos antes nosotros podriamos ordenarlos si lo ingresamos dentro de un array, para entender el concepto veamos el siguiente codigo:

a = {}
for n in pairs(lineas) do a[#a + 1] = n end
table.sort(a)
for i, n in ipairs(a) do print(n) end
Anuncios

Primero creamos el array donde lo vamos a almacenar, en este caso a, luego usamos un bucle for para que obtenga los nombres y los almacena en el array antes creado incrementando las posiciones, nuestra siguiente linea se encarga de ordenarlos y por ultimo por medio de otro bucle for imprimos nuestra “tabla” ordenada, veamos su salida:

luaH_get
luaH_present
luaH_set
Anuncios

A pesar de haber funcionado para Lua los arrays tampoco tienen orden (despues de todo son tablas) pero sabemos como contarlos asi que podemos obtener valores ordenados mientras accedamos al array con indices ordenados, es por esto que deberias siempre atravesar arrays con ipairs, en lugar de hacerlo con pairs, ya que el primero impone el orden de claves 1,2,3… donde este ultima usa el orden natural arbitrario de la tabla, como una solucion mas avanzada podemos escribir un iterador que atraviesa una tabla siguiendo el orden de sus claves, un parametro opcional llamado f nos permite la especificacion de un orden alternativo, veamos el codigo:

function paresPorClaves(t, f)
	local a = {}
	for n in pairs(t) do a[#a + 1] = n end
	table.sort(a, f)
	local i = 0
	return function()
		i = i + 1
		return a[i], t[a[i]]
	end
end
Anuncios

En este caso la primera parte es parecido a lo que vimos anteriormente pero despues de ordenar el array, creamos la variable para el iterador, despues tenemos al iterador que se encargara de incrementar por cada paso el valor de i y devolver primero el nombre de la funcion y el valor de la misma, apliquemos la funcion anterior en el siguiente codigo:

sort.lua

function paresPorClaves(t, f)
	local a = {}
	for n in pairs(t) do a[#a + 1] = n end
	table.sort(a, f)
	local i = 0
	return function()
		i = i + 1
		return a[i], t[a[i]]
	end
end

lineas = {
	luaH_set = 10,
	luaH_get = 24,
	luaH_present = 48,
}

for nombre, linea in paresPorClaves(lineas) do
	print(nombre, linea)
end
Anuncios

Si lo ejecutamos veremos la siguiente salida:

tinchicus@dbn001dsk:~/lenguaje/lua$ lua5.3 sort.lua
luaH_get        24
luaH_present    48
luaH_set        10
tinchicus@dbn001dsk:~/lenguaje/lua$

Como pueden observar no solamente lo ordenaremos alfabeticamente sino que a su vez nos trae el valor asignado a ese nombre.

Anuncios

En resumen, hoy hemos visto como trabaja sort, para que sirve como se usa, en donde se puede usar y en donde no se puede usar, y como solucionarlo, espero les haya sido util sigueme en Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Tengo un Patreon donde podes acceder de manera exclusiva a material para este blog antes de ser publicado, sigue los pasos del link para saber como.

Tambien podes donar

Es para mantenimiento del sitio, gracias!

$1.00