Saltar para o conteúdo principal
Versão: 20 R10

Find in sorted array

Find in sorted array* ( array ; valor ; > or < {; posPrim {; posUlt}} ) : Boolean

ParâmetroTipoDescrição
arrayArrayArray para pesquisar
valorExpressionValor do mesmo tipo para procurar no array
> or <Operador> se o array está classificado em ordem crescente, < se ele está em ordem decrescente
posPrimIntegerPosição da sua primeira ocorrência se o valor for encontrado; caso contrário, a posição em que o valor deve ser inserido
posUltIntegerPosição de sua última ocorrência se o valor for encontrado; caso contrário, mesmo que posPrim
ResultadoBooleanTrue se pelo menos um elemento no array corresponde ao valor, False caso contrário

Descrição

novo comando Find in sorted array devolve true se pelo menos um elemento no array ordenado com o valor e opcionalmente devolve a posição dos elementos correspondentes. Diferente de Find in array, Find in sorted array só funciona com um array ordenado e oferece informação sobre a posição das ocorrências, o que lhe permite inserir elementos se for necessário.

O array deve estar já ordenado e deve coincidir com a ordem específica pelo parâmetro > ou < (ou seja, o símbolo "maior que" para a ordem ascendente e o símbolo "menor que" para a ordem descendente). O comando Find in sorted array tomará vantagem da ordem e uso de um algoritmo de ´pesquisa binária, que é bem mais eficiente para grandes arrays (para mais informação, consulte a página algoritmo de pesquisa binária em Wikipédia). No entanto, se o array não está ordenado corretamente, o resultado pode ser incorreto.

Note: Quando usar este comando com um array ordenado do tipo Objeto, pode passar uma referência de objeto no valor

O comando ignorará a indicação de ordem se comporta como um Find in array (pesquisa sequencial, devolvendo -1 para posPrim e posUlt se não se encontra o valor) em qualquer dos seguintes casos:

  • se o tipo de array não pode ordenar (por exemplo arrays ponteiro),
  • se o array é de tipo booleano (não preciso),
  • se a base de dados não é Unicode (modo compatibilidade) e o array é uma cadeia ou array texto,
  • quando é procurado em um array text para uma cadeia que inclui um coringa ('@') no começo ou no meio da cadeia (utilizando uma pesquisa binária com um caractere coringa não é possível porque os elementos correspondentes podem não ser contínuos no array).

Em caso de que o comando devolva False, o valor devolvido em posPrim pode ser passado a INSERT IN ARRAY para inserir o valor no array mantendo o array ordenado. Esta sequencia é mais rápida que a inserção de um novo elemento ao final do array e logo chamar a SORT ARRAY para mover ele ao lugar correto.

O valor devolvido em postUlt pode ser combinado com o valor devolvido em posPrim para realizar sobre cada elemento do array que coincida com o valor (sob um ARRAY TO LIST) ou para encontrar o número total de ocorrências (como o encontraria Count in array porém mais rápido).

Exemplo 1

Você deseja inserir um valor, se for necessário, mantendo o 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

Exemplo 2

Você quer encontrar o número de ocorrências das cadeias que começam por "test" e criar uma cadeia que vincula todos estes 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

Ver também

Count in array
Find in array
SORT ARRAY

Propriedades

Número do comando1333
Thread-seguro