Find in sorted array
Find in sorted array ( array ; valor ; > or < {; posPrim {; posUlt}} ) -> Resultado
Parámetro | Tipo | Descripción | |
---|---|---|---|
array | Array | → | Array a buscar |
valor | Expression | → | Valor del mismo tipo a buscar en el array |
> or < | Operador | → | > si el array está en orden ascendente, < si el está en orden descendente |
posPrim | Integer | ← | Posición de su primera aparición si se encuentra el valor; de lo contrario la posición donde debe insertarse el valor |
posUlt | Integer | ← | Posición de su última ocurrencia si se encuentra el valor; de lo contrario lo mismo que posPrim |
Resultado | Boolean | ← | True si al menos un elemento en el array corresponde al valor, de lo contrario False |
Descripción
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.
Nota: cuando se utiliza este comando con un array ordenado de tipo Object, sólo se puede pasar una referencia a objeto en valor.
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 utilizar en conjunto con el valor devuelto en posPrim para iterar sobre cada elemento del array correspondiente al valor (vía un ARRAY TO LIST) o para encontrar el número total de ocurrencias (como lo encontraría Count in array, pero más rápido).
Ejemplo 1
Usted desea insertar un valor, si es necesario, manteniendo el array ordenado:
var $pos : Integer
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
Ejemplo 2
Usted quiere encontrar el número de ocurrencias de las cadenas que comienzan por "test" y crear una cadena que concatena todos estos elementos:
var $posFirst ;$posLast : Integer
var $output : Text
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