Closed RaniAgus closed 3 years ago
Cierro el issue porque me acabo de dar cuenta que no es un bug en sí, sino que es un mal uso de las commons, debí usar un comparador que incluya el =
para marcar que el primer elemento va siempre antes que el segundo:
static bool _ayudantes_alfabetico(t_person *primero, t_person *segundo) {
return strcmp(primero->name, segundo->name) <= 0;
}
Hace unos días vi este comentario en la función
list_sort
, entonces me puse a investigar y a probar algoritmos mejores. https://github.com/sisoputnfrba/so-commons-library/blob/1c885402ddbf4cd2feb7d9d879ba439c5ca12c23/src/commons/collections/list.c#L234En medio de todo esto, vi que no había ningún test que permita chequear si
list_sort
acepta más de un criterio (dicho en criollo, un criterio "de desempate"), así que hice uno:Y los resultados me dieron que la función ordena exactamente al revés de lo que debería:
Me parece que esto pasa porque el comparador devuelve true solo si "el primero debe ir antes que el segundo", y en casos de "empate" esto da false, por lo que se efectúa el intercambio. Como resultado, termina quedando al revés de como debería
Yo propongo usar comparadores que funcionen como
strcmp
, que devuelven un valor negativo si el primero va antes, cero si son iguales, y positivo si el segundo va antes.Solo haría falta cambiar el tipo del comparador a int (en las 2 funciones que lo utilizan) y esta línea: https://github.com/sisoputnfrba/so-commons-library/blob/1c885402ddbf4cd2feb7d9d879ba439c5ca12c23/src/commons/collections/list.c#L246 por esta:
Es más, para mí esto permitiría que el comparador sea más expresivo en cuanto a lo que hace, porque para comparar strings se usaría strcmp directo:
y para valores numéricos se haría una diferencia:
en lugar de usar booleanos.
¿Qué opinan?