como obtengo el valor mas chico de un array

Post Reply
User avatar
goosfancito
Posts: 1955
Joined: Fri Oct 07, 2005 7:08 pm

como obtengo el valor mas chico de un array

Post by goosfancito »

Hola.
Para no hacer un bucle, puedo usar un eval para obtener la posicion del valor mas chico de un array con respecto a un valor dado?
ejempo:
array:
8
7
10
12
5
valor dado: 3
valor que deberia de obtener: 4
FWH 21.02
Harbour 3.2.0dev (r2104281802)
Copyright (c) 1999-2021, https://harbour.github.io/
User avatar
Antonio Linares
Site Admin
Posts: 42512
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Has thanked: 31 times
Been thanked: 73 times
Contact:

Re: como obtengo el valor mas chico de un array

Post by Antonio Linares »

Code: Select all | Expand

function Main()

   local a := { 8, 7, 10, 12, 5 }
   
   ? BuscaPos( a, 3 )

return nil

function BuscaPos( a, nVal )

   local nResult 
   
   AScan( ASort( AClone( a ) ), { | n, nPos | If( nVal < n, nResult := AScan( a, n ) - 1,), n > nVal } )
   
return nResult
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
goosfancito
Posts: 1955
Joined: Fri Oct 07, 2005 7:08 pm

Re: como obtengo el valor mas chico de un array

Post by goosfancito »

gracias

veo que me falta muchisimo para aprender a utilizar estas funciones. gracias.
FWH 21.02
Harbour 3.2.0dev (r2104281802)
Copyright (c) 1999-2021, https://harbour.github.io/
User avatar
Willi Quintana
Posts: 1025
Joined: Sun Oct 09, 2005 10:41 pm
Location: Cusco - Perú
Contact:

Re: como obtengo el valor mas chico de un array

Post by Willi Quintana »

Buenos dias amigos, esto para obtener el valo minimo de una array

Code: Select all | Expand

Function AMIN(aDats, lCero, nIni, nPos)
local nMin := 0
DEFAULT lCero := .t.
DEFAULT nINi  := 1
DEFAULT nPos  := 0
IF VALTYPE(aDats) <> "A"
  Return(0)
EndIf
nPos := If(nPos = 0, LEN(aDats), nPos)
nMin := aDats[nIni]
If lCero
   AEVAL(aDats, {|xEl| nMin := IF(VALTYPE(xEl) = "N", IF(xEl < nMin, xEl, nMin), nMin)}, nIni, nPos )
  Else
   AEVAL(aDats, {|xEl| nMin := IF(VALTYPE(xEl) = "N" .AND. xEl <> 0, IF(xEl < nMin, xEl, nMin), nMin)}, nIni, nPos )
EndIf
Return(nMin)
 
User avatar
goosfancito
Posts: 1955
Joined: Fri Oct 07, 2005 7:08 pm

Re: como obtengo el valor mas chico de un array

Post by goosfancito »

Gracias a ambos.

tomo como ejemplo este:
AScan( ASort( AClone( a ) ), { | n, nPos | If( nVal < n, nResult := AScan( a, n ) - 1,), n > nVal } )
en mi caso "n" voy a usarlo asi: cToD(a:cargo["fecha"])
Mi consulta: para que el codigo no quede tan largo como:

Code: Select all | Expand

 AScan( ASort( AClone( a ) ), { | n, nPos | If( nVal < cToD(a:cargo["fecha"]), nResult := AScan( a, cToD(a:cargo["fecha"]) ) - 1,), cToD(a:cargo["fecha"]) > nVal } )
Hay alguna manera que cuando defina la variable, o sea en { |n, nPos |}, puda indicar que n es cToD(a:cargo["fecha"])?

gracias
FWH 21.02
Harbour 3.2.0dev (r2104281802)
Copyright (c) 1999-2021, https://harbour.github.io/
User avatar
Antonio Linares
Site Admin
Posts: 42512
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Has thanked: 31 times
Been thanked: 73 times
Contact:

Re: como obtengo el valor mas chico de un array

Post by Antonio Linares »

AScan( ASort( AClone( a ) ), { | n, nPos | n := cToD(a:cargo["fecha"]), If( nVal < n, nResult := AScan( a, n) ) - 1,), cToD(n) > nVal } )

estás seguro de que ese código te funciona bien ?
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
goosfancito
Posts: 1955
Joined: Fri Oct 07, 2005 7:08 pm

Re: como obtengo el valor mas chico de un array

Post by goosfancito »

Code: Select all | Expand

METHOD BuscaPos( a, nVal ) CLASS TAbm

   LOCAL nResult:= 0
   LOCAL cMenor:= ""

   IF Len( a ) > 0

      AScan( ASort( AClone( a ) ), ;
             { | n, nPos | ;
               IF( nVal < CToD( n:cargo[ "fecha" ] ), ;
                   ( cMenor:= n:cargo["fecha"], nResult := AScan( a, {|o| o:cargo["fecha"] ==cMenor}) - 1 ) , ), ;
               CToD( n:cargo[ "fecha" ] ) > nVal } )
   ENDIF

   RETURN nResult
 
Asi si me funciona Antonio.
Last edited by goosfancito on Thu Aug 24, 2023 8:06 am, edited 1 time in total.
FWH 21.02
Harbour 3.2.0dev (r2104281802)
Copyright (c) 1999-2021, https://harbour.github.io/
User avatar
Antonio Linares
Site Admin
Posts: 42512
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Has thanked: 31 times
Been thanked: 73 times
Contact:

Re: como obtengo el valor mas chico de un array

Post by Antonio Linares »

lo cual quiere decir que ascan(a, n:cargo["fecha"]) esta devolviendo cero

Por lo que veo, estas usando objetos en vez de números, por eso AScan() devuelve cero, no encuentra lo que buscas

Prueba con AScan( a, { | o | o:Cargo[ "fecha" ] == n:Cargo[ "fecha" ] } )
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
goosfancito
Posts: 1955
Joined: Fri Oct 07, 2005 7:08 pm

Re: como obtengo el valor mas chico de un array

Post by goosfancito »

Code: Select all | Expand

METHOD BuscaPos( a, nVal ) CLASS TAbm

   LOCAL nResult:= 0
   LOCAL cMenor:= ""

   IF Len( a ) > 0

      AScan( ASort( AClone( a ) ), ;
             { | n, nPos | ;
               IF( nVal < CToD( n:cargo[ "fecha" ] ), ;
                   ( cMenor:= n:cargo["fecha"], nResult := AScan( a, {|o| o:cargo["fecha"] ==cMenor}) - 1 ) , ), ;
               CToD( n:cargo[ "fecha" ] ) > nVal } )
   ENDIF

   RETURN nResult
Asi me funciona Antonio.
FWH 21.02
Harbour 3.2.0dev (r2104281802)
Copyright (c) 1999-2021, https://harbour.github.io/
User avatar
goosfancito
Posts: 1955
Joined: Fri Oct 07, 2005 7:08 pm

Re: como obtengo el valor mas chico de un array

Post by goosfancito »

Porque quiero hacer esto?
porque quiero insertar el nuevo item que se crea por sobre o debajo de la fecha inmediata (menor o mayor) entonces con esto
me livero estar "ordenando" el tree.

ya voy a postear el cambio en el github
FWH 21.02
Harbour 3.2.0dev (r2104281802)
Copyright (c) 1999-2021, https://harbour.github.io/
User avatar
Antonio Linares
Site Admin
Posts: 42512
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Has thanked: 31 times
Been thanked: 73 times
Contact:

Re: como obtengo el valor mas chico de un array

Post by Antonio Linares »

me alegro que sigas avanzando :-)
regards, saludos

Antonio Linares
www.fivetechsoft.com
Post Reply