Clase Dictionary (VFP)

From codeWiki
Jump to: navigation, search

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
Personal tools
Namespaces
Variants
Actions
Navigation
Toolbox