4D v15

Find in sorted array

Inicio

 
4D v15
Find in sorted array

Find in sorted array 


 

Find in sorted array ( array ; valor ; > or < {; posPrim {; posUlt}} ) -> Resultado 
Parámetro Tipo   Descripción
array  Array in Array a buscar
valor  Expresión in Valor del mismo tipo a buscar en el array
> or <  Operador in > si array se ordena en orden ascendente, < si se ordena en orden descendente
posPrim  Entero largo in Posición de su primera ocurrencia si se encuentra el valor; de lo contrario la posición donde debería insertarse el valor
posUlt  Entero largo in Posición de su última ocurrencia si no se encuentra el valor; de lo contrario igual posPrim
Resultado  Booleano in True si por lo menos un elemento en el array coincide con el valor, False en caso contrario

Originalmente introducido en 4D v14 R4

Tema: Arrays

El nuevo comando Find in sorted array devuelve true si al menos un elemento en el array ordenado con el valor y opcionalmente devuelve la posición de los elementos correspondientes. A diferencia de Find in array, Find in sorted array sólo funciona con un array ordenado y ofrece información sobre la posición de las ocurrencias, lo que le permite insertar elementos si es necesario.

El array debe estar ya ordenado y debe coincidir con el orden especificado por el parámetro > or < (es decir, el símbolo "mayor que" para el orden ascendente y el símbolo "menor que" para el orden descendente). El comando Find in sorted array tomará ventaja de la ordenación y uso de un algoritmo de búsqueda binaria, que es mucho más eficiente para grandes arrays (para más información, consulte la página algoritmo de búsqueda binaria en Wikipedia). Sin embargo, si el array no está ordenado correctamente, el resultado puede ser incorrecto.

El comando ignorará la indicación de ordenación y se comporta como un Find in array estándar (búsqueda secuencial, devolviendo -1 para posPrim y posUlt si no se encuentra el valor) en cualquiera de los siguientes casos:

  • si el tipo de array no se puede ordenar (por ejemplo arrays puntero),
  • si el array es de tipo booleano (no preciso),
  • si la base de datos no es Unicode (modo compatibilidad) y el array es una cadena o array texto,
  • cuando se busca en un array text para una cadena que incluye un comodín ('@') al principio o en el medio de la cadena (utilizando una búsqueda binaria con un carácter comodín no es posible porque los elementos correspondientes pueden no ser contiguos en el array).

En caso de que el comando devuelva False, el valor devuelto en posPrim se puede pasar a INSERT IN ARRAY para insertar el valoren el array manteniendo el array ordenado. Esta secuencia es más rápida que la inserción de un nuevo elemento al final del array y luego llamar a SORT ARRAY para moverlo al lugar correcto.
    
El valor devuelto en posUlt se puede combinar con el valor devuelto en posPrim para iterar sobre cada elemento del array correspondiente al valor (vía un For...End for) o para encontrar el número total de ocurrencias (como lo encontraría el comando Count in array, más rápidamente).

Usted desea insertar un valor, si es necesario, manteniendo el array ordenado:

 C_LONGINT($pos)
 If(Find in sorted array($array ;$value ;>;$pos)
    ALERT("Found at pos "+String($pos))
 Else
    INSERT IN ARRAY($array ;$pos)
    $array{$pos}:=$value
 End if


Usted quiere encontrar el número de ocurrencias de las cadenas que comienzan por "test" y crear una cadena que concatena todos estos elementos:

 C_LONGINT($posFirst ;$posLast)
 C_TEXT($output)
 If(Find in sorted array($array ;"test@";>;$posFirst ;$posLast))
    $output:="Found "+String($posLast-$posFirst+1)+" results :\n"
 End if
 For($i ;$posFirst ;$posLast)
    $output:=$output+$array{$i}+"\n"
 End for

 
PROPIEDADES 

Producto: 4D
Tema: Lenguaje

 
HISTORIA 

 
ARTICLE USAGE

4D v15 - Actualización (standard edition) ( 4D v15)