Página 1 de 1

Por que a Table Hash ordena as chaves?

Enviado: 11 Jul 2023 10:22
por clodoaldomonteiro
Bom dia amigos.

Estou usando o Hash() para um pequeno projeto e vi que crio passar as chaves numa determinada ordem, mas quando faço um For ... Next ou visualizo o Hash com ValToPrg(), as chaves estão ordenadas por ordem alfabética.

Pergunto se existe alguma possibilidade de setar para que permaneça a ordem de criação da variável Hash?

Criando a Hash:

Código: Selecionar todos

   Private hIrMemo := Hash(;
    'ValorVerbasIncidentes', 0.00,;
    'ValorVerbasDeducoes'  , 0.00,;
    'ValorDescPrevidencia' , 0.00,;
    'qtdDependenteIR'      , 0.00,;
    'valorPorDependenteIR' , 0.00,;
    'DeducaoInativo65Anos' , 0.00,;
    'BaseCalculoIrrfNormal', 0.00,;
    'valorDeduzirIRSimplificado' , 0.00,;
    'BaseCalculoIrrfSimplificado', 0.00,;
    'ValorAliquotaIRRF'    , 0.00,;
    'ValorDeducaoIRRF'     , 0.00,;
    'ValorIRRFPago'        , 0.00,;
    'ValorIRRFLancado'     , 0.00;
    )
Resultado ordenado (depois de transformar em JSON):

Código: Selecionar todos

{
	"BaseCalculoIrrfNormal": 4201.37,
	"BaseCalculoIrrfSimplificado": 0.00,
	"DeducaoInativo65Anos": 0.00,
	"ValorAliquotaIRRF": 22.50,
	"ValorDeducaoIRRF": 651.73,
	"ValorDescPrevidencia": 469.05,
	"ValorIRRFLancado": 293.57,
	"ValorIRRFPago": 0.00,
	"ValorVerbasDeducoes": 0.00,
	"ValorVerbasIncidentes": 4670.42,
	"qtdDependenteIR": 0,
	"valorDeduzirIRSimplificado": 0.00,
	"valorPorDependenteIR": 189.59
}
Grato pela ajuda.

Por que a Table Hash ordena as chaves?

Enviado: 11 Jul 2023 11:58
por Ana Mitoooo

Código: Selecionar todos

   Private hIrMemo
   M->hIrMemo := hb_Hash()
   hb_hKeepOrder( M->hIrMemo, .t. )

Por que a Table Hash ordena as chaves?

Enviado: 11 Jul 2023 13:03
por clodoaldomonteiro
Ana Mitoooo escreveu:

Código: Selecionar todos

   Private hIrMemo
   M->hIrMemo := hb_Hash()
   hb_hKeepOrder( M->hIrMemo, .t. )
Fico grato pela ajuda, mas esqueci de falar que é pra xHarbour e não funcionou, ou não estou informando a Lib com estas funções.

Por que a Table Hash ordena as chaves?

Enviado: 11 Jul 2023 13:03
por Itamar M. Lins Jr.
Olá!

Código: Selecionar todos

HB_HSORT()

Reorganizes the internal list of the hash table to be sorted

Syntax

      HB_HSORT( <hsTable> ) -> <hsSortedTable>

Arguments

<hsTable> a hash table, created by HB_HASH()

Returns
Funções hb_h* geralmente para HASH HBMK2 -find hb_h

Saudações,
Itamar M. Lins Jr.

Por que a Table Hash ordena as chaves?

Enviado: 11 Jul 2023 13:05
por Itamar M. Lins Jr.
Olá!

Código: Selecionar todos

C:\dev\hb32-code>HBMK2 -find hb_h
hbhpdf.hbc (instalado):
   hb_HPDF_GetErrorString()
   hb_HPDF_IsVersion()
   hb_HPDF_Version()
xhb.hbc (instalado):
   hb_HashAddMember()
   hb_HashId()
   xhb_HashError()
Núcleo Harbour (instalado):
   hb_HAllocate()
   hb_Hash()
   hb_HAutoAdd()
   hb_HBinary()
   hb_HCaseMatch()
   hb_HClear()
   hb_HClone()
   hb_HCopy()
   hb_HDefault()
   hb_HDel()
   hb_HDelAt()
   hb_HEval()
   hb_HexToNum()
   hb_HexToStr()
   hb_HFill()
   hb_HGet()
   hb_HGetDef()
   hb_HGetRef()
   hb_HHasKey()
   hb_HKeepOrder()
   hb_HKeyAt()
   hb_HKeys()
   hb_HMAC_MD5()
   hb_HMAC_SHA1()
   hb_HMAC_SHA224()
   hb_HMAC_SHA256()
   hb_HMAC_SHA384()
   hb_HMAC_SHA512()
   hb_HMerge()
   hb_Hour()
   hb_HPairAt()
   hb_HPos()
   hb_hrbDo()
   hb_hrbGetFunList()
   hb_hrbGetFunSym()
   hb_hrbLoad()
   hb_hrbRun()
   hb_hrbSignature()
   hb_hrbUnload()
   hb_HScan()
   hb_HSet()
   hb_HSetAutoAdd()
   hb_HSetBinary()
   hb_HSetCaseMatch()
   hb_HSetDef()
   hb_HSetOrder()
   hb_HSort()
   hb_HValueAt()
   hb_HValues()

C:\dev\hb32-code>                    
Saudações,
Itamar M. Lins Jr.

Por que a Table Hash ordena as chaves?

Enviado: 11 Jul 2023 13:53
por clodoaldomonteiro
Itamar M. Lins Jr. escreveu:Olá!

Código: Selecionar todos

C:\dev\hb32-code>HBMK2 -find hb_h
hbhpdf.hbc (instalado):
   hb_HPDF_GetErrorString()
   hb_HPDF_IsVersion()
   hb_HPDF_Version()
xhb.hbc (instalado):
   hb_HashAddMember()
   hb_HashId()
   xhb_HashError()
Núcleo Harbour (instalado):
   hb_HAllocate()
   hb_Hash()
   hb_HAutoAdd()
   hb_HBinary()
   hb_HCaseMatch()
   hb_HClear()
   hb_HClone()
   hb_HCopy()
   hb_HDefault()
   hb_HDel()
   hb_HDelAt()
   hb_HEval()
   hb_HexToNum()
   hb_HexToStr()
   hb_HFill()
   hb_HGet()
   hb_HGetDef()
   hb_HGetRef()
   hb_HHasKey()
   hb_HKeepOrder()
   hb_HKeyAt()
   hb_HKeys()
   hb_HMAC_MD5()
   hb_HMAC_SHA1()
   hb_HMAC_SHA224()
   hb_HMAC_SHA256()
   hb_HMAC_SHA384()
   hb_HMAC_SHA512()
   hb_HMerge()
   hb_Hour()
   hb_HPairAt()
   hb_HPos()
   hb_hrbDo()
   hb_hrbGetFunList()
   hb_hrbGetFunSym()
   hb_hrbLoad()
   hb_hrbRun()
   hb_hrbSignature()
   hb_hrbUnload()
   hb_HScan()
   hb_HSet()
   hb_HSetAutoAdd()
   hb_HSetBinary()
   hb_HSetCaseMatch()
   hb_HSetDef()
   hb_HSetOrder()
   hb_HSort()
   hb_HValueAt()
   hb_HValues()

C:\dev\hb32-code>                    
Saudações,
Itamar M. Lins Jr.
São ótimas funções, mas não existe na versão do xHarbour do sistema que estou ajustando, e fico muito grato pela ajuda.

Abraços.

Por que a Table Hash ordena as chaves?

Enviado: 11 Jul 2023 14:28
por Itamar M. Lins Jr.
Olá!
Use os "dons do espírito" !

Código: Selecionar todos

  Private hIrMemo := Hash(;
    '001_ValorVerbasIncidentes', 0.00,;
    '002_ValorVerbasDeducoes'  , 0.00,;
    '003_ValorDescPrevidencia' , 0.00,;
    '004_qtdDependenteIR'      , 0.00,;
    '005_valorPorDependenteIR' , 0.00,;
    '006_DeducaoInativo65Anos' , 0.00,;
    '007_BaseCalculoIrrfNormal', 0.00,;
    '008_valorDeduzirIRSimplificado' , 0.00,;
    '009_BaseCalculoIrrfSimplificado', 0.00,;
    '010_ValorAliquotaIRRF'    , 0.00,;
    '011_ValorDeducaoIRRF'     , 0.00,;
    '012_ValorIRRFPago'        , 0.00,;
    '013_ValorIRRFLancado'     , 0.00;
    )
Saudações,
Itamar M. Lins Jr.

Por que a Table Hash ordena as chaves?

Enviado: 12 Jul 2023 07:29
por Wanderlei
A ordem faz diferença?
já que no hash vc utiliza o nome da tag, isso quer dizer que a ordem não importa

Por que a Table Hash ordena as chaves?

Enviado: 12 Jul 2023 08:12
por clodoaldomonteiro
Wanderlei escreveu:A ordem faz diferença?
já que no hash vc utiliza o nome da tag, isso quer dizer que a ordem não importa
Bom dia,
Faz sim, é que as informações tem uma sequência útil para o usuário e queria fazer uma demonstração delas com um For ... Next e de forma genérica, já que vai ter mais de um grupo de informações de Memória de Cálculo.