Clase Dictionary (VFP)
From codeWiki
Por: VictorEspina
La clase Dictionary implementa algo conocido en otros lenguajes como Associative Array. Básicamente consiste en una clase que permite registrar valores de cualquier tipo asociados a una clave de tipo string y luego recuperar dichos valores mediante el uso de la clave asociada.
Ejemplo:
LOCAL oDias oDias = CREATE("Dictionary") oDias.Add("lun","Lunes") oDias.Add("mar","Martes") oDias.Add("mie","Miercoles") oDIas.Add("jue","Jueves") oDias.Add("vie","Viernes") ?oDias.Values["mar"] --> "Martes"
La clase tambien expone un método que permite determinar si existe un valor registrado bajo una cierta clave:
IF oDias.ContainsKey("dom") ?oDias.Values["dom"] --> "Domingo" ENDIF
El array Values es de lectura/escritura, asi que podemos cambiar el valor de un elemento en el diccionario simplemente ubicando el elemento por su clave y asignándole un nuevo valor al item:
oDias.Values["sab"] = "Saturday"
Tambien es posible recorrer todos los elementos y sus claves como si se tratase de una colección:
FOR i = 1 TO oDias.Count ?oDias.Keys[i] + " = " + oDias.Values[i] ENDFOR lun = Lunes mar = Martes mie = Miercoles jue = Jueves vie = Viernes sab = Saturday dom = Domingo
* Dictionary (Class) * Implementacion de un array asociativo * * Autor: Victor Espina * Fecha: Abril 2012 * * Uso: * LOCAL oDict * oDict = CREATE("Dictionary") * oDict.Add("nombre","VICTOR") * oDict.Add("apellido","ESPINA") * ?oDict.Values["nombre"] --> "VICTOR" * * IF oDict.containsKey("apellido") * oDict.Values["apellido"] = "SARCOS" * ENDIF * * FOR i = 1 TO oDict.Count * ?oDict.Keys[i], oDict.Values[i] * ENDFOR * * oCopy = oDict.Clone() * ?oCopy.Values["apellido"] --> "SARCOS" * DEFINE CLASS Dictionary AS Custom DIMEN Values[1] DIMEN Keys[1] Count = 0 PROCEDURE Init(pnCapacity) IF PCOUNT() = 0 pnCapacity = 0 ENDIF DIMEN THIS.Values[MAX(1,pnCapacity)] DIMEN THIS.Keys[MAX(1,pnCapacity)] THIS.Count = pnCapacity ENDPROC PROCEDURE Values_Access(nIndex1,nIndex2) IF VARTYPE(nIndex1) = "N" RETURN THIS.Values[nIndex1] ENDIF LOCAL i FOR i = 1 TO THIS.Count IF THIS.Keys[i] == nIndex1 RETURN THIS.Values[i] ENDIF ENDFOR ENDPROC PROCEDURE Values_Assign(cNewVal,nIndex1,nIndex2) IF VARTYPE(nIndex1) = "N" THIS.Values[nIndex1] = m.cNewVal ELSE LOCAL i FOR i = 1 TO THIS.Count IF THIS.Keys[i] == nIndex1 THIS.Values[i] = m.cNewVal EXIT ENDIF ENDFOR ENDIF ENDPROC ---------------------------------------- -- M E T O D O S ---------------------------------------- * Clear * Elimina el contenido de la clase * PROCEDURE Clear DIMEN THIS.Values[1] DIMEN THIS.Keys[1] THIS.Count = 0 ENDPROC * Add * Incluye un nuevo item en el diccionario * PROCEDURE Add(pcKey, puValue) IF THIS.ContainsKey(pcKey) RETURN .F. ENDIF THIS.Count = THIS.Count + 1 DIMEN THIS.Values[THIS.Count] DIMEN THIS.Keys[THIS.Count] THIS.Values[THIS.Count] = puValue THIS.Keys[THIS.Count] = pcKey ENDPROC * containsKey * Permite determinar si existe un item registrado * con la clase indicada * PROCEDURE ContainsKey(pcKey) LOCAL i,lResult lResult = .F. FOR i = 1 TO THIS.Count IF THIS.Keys[i] == pcKey lResult = .T. EXIT ENDIF ENDFOR RETURN lResult ENDPROC * getKeys * Copia en un array la lista de claves registradas * PROCEDURE getKeys(paTarget) IF THIS.Count = 0 RETURN .F. ENDIF DIMEN paTarget[THIS.Count] ACOPY(THIS.Keys, paTarget) RETURN THIS.Count ENDPROC * Clone * Devuelve una copia del diccionario con todo su contenido * PROCEDURE Clone() LOCAL oClone,i oClone = CREATE(THIS.Class) FOR i = 1 TO THIS.Count oClone.Add(THIS.Keys[i], THIS.Values[i]) ENDFOR RETURN oClone ENDPROC ENDDEFINE