Los mapas o diccionarios en programación son listas de datos, que se relacionan con el par clave/valor. Esto es que cada valor tiene una clave, algo así como un diccionario. Que da entrada o clave tiene una descripción o valor.

Este tipo listas se pueden implementar en Free Pascal o Moderm Pascal (ahora este nuevo nombre se está poniendo de moda) usando la clase TFPGMap, La clase TFPGMap es una especialización de las clases genéricas.

Introducción

La programación genérica centra en el algoritmo, y no en el tipo de datos, para ello usa tios de datos genéricos. Una buena introducción a la programación con datos genéricos podría ser esta:

Los genéricos, a veces llamados parámetros genéricos, un nombre que permite presentarlos mucho mejor. A diferencia del parámetro de una función (argumento), que tiene un valor, el parámetro genérico es un tipo. Y un parámetro genérico parametrizado una clase, un interfaz, un record, o, con menor frecuencia, un método.

https://ftp-developpez.com/sjrd/tutoriels/delphi-generiques/delphi-genericos.pdf

Declaración y uso

Antes de seguir, hay que tener en cuenta que la implementación de genéricos en Free Pascal es diferente que en Delphi. Free Pascal implementó el uso de genéricos antes que Delphi, y para mantener la compatibilidad con este, se añadió la unidad Generics.Collections. Más información sobre esto en la wiki de FreePascal.

La clase TFPGMap nos permite crear una lista de pares clave/valor, tal como comenté antes. Y la clave y valor puede ser de cualquier tipo de dato, incluso diferentes entre ellos. Aunque con fines didácticos, voy a usar cadenas (string).

Cómo se puede ver en este código, debemos usar la unidad fgl, y la declaración del tipo usamos string para la clave y lo mismo para el valor.

Observa el código siguiente:

En la línea 12 creamos el mapa. Tras ello, añadimos diferentes pares clave/valor. En la línea 17 mostramos el número de elementos que hay, por supuesto, antes de terminar liberamos la memoria.

Búsqueda de un elemento

Ahora vamos modificar el código anterior para localizar una clave y su valor

Con el método TryGetData podemos obtener el valor de una clave. En este caso buscamos la clave Telefono. La función devuelve true si encontró la clave indicada. Por el parámetro Valor, nos devuelve el valor que corresponde con la clave buscada.

También existe la posibilidad de buscar una clave y obtener el índice esta. El código siguiente lo haría.

Fíjate que para usar la búsqueda y obtener el índice, la lista debe estar ordenada. La método Find, nos devuelve true si ha tenido éxito en la búsqueda. Y usando los métodos Keys y Data, indicándoles el índice, podemos obtener la clave y el valor de dicha clave respectivamente.

Probando algunas maldades

Observa el siguiente código

En este código, realizamos algunas «maldades», como añadir una clave y valor que ya existe (línea 27). Al hacer esto no ocurre ningún error ni aviso, etc. Simplemente no se añade. Esto se comprueba que el número de elementos no ha variado

En el caso de que la clave exista, y el valor se diferente (línea 31) se modifica el contenido del valor. Tal como se muestra en la línea siguiente.

Para borrar un elemento, simplemente llamando al método Remove, indicando su clave, este es eliminado (línea 34). Si tratamos de borrar una clave que no existe, simplemente no ocurre nada, tal como muestra la línea 37.

Gestionar el orden.

En este ejemplo, simplemente, hemos añadido y borrado elementos. Pero también tenemos la posibilidad de gestionar el orden de los elementos que se añaden. Esto es interesante, sobre todo, cuando la clave, o el valor es un tipo de dato como un objeto.

La clase TMap, dispone de dos eventos, los cuales podemos usar en nuestro programa. Estos OnDataCompare y OnKeyCompare. Estos eventos se dispara cada vez que hay que comparar se compara un valor, o una clave. Para hacer uso de alguna de estos eventos, debemos asignarlo en el momento de crear el objeto.

Y declarar las correspondientes funciones.

El valor que deben devolver es un entero cuyo valor debe ser uno de los siguientes:

  • Si el resultado de esta función es negativo, se considera que la primera clave (key1) es ‘menor’ que la segunda clave (key2) y se moverá antes que la segunda en la lista.
  • Si el resultado de la función es positivo, se considera que la primera clave (key1) es ‘mayor que’ la segunda clave (key2) y se moverá después de la segunda en la lista.
  • Si el resultado de la función es cero, se considera que las claves son ‘iguales’ y no se realizará ningún movimiento.

Te dejo aquí abajo el código completo. Échale un vistazo.

Saludos

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio esta protegido por reCAPTCHA y laPolítica de privacidady losTérminos del servicio de Googlese aplican.

El periodo de verificación de reCAPTCHA ha caducado. Por favor, recarga la página.