4D oferece características poderosas para trabalhar com coleções de objetos. Por exemplo, pode criar uma coleção de cidades com os seus países e continentes associados. Manipular essas coleções com funções embutidas como classificar, ordenar e filtrar é muito fácil.
4D v20 R3 introduz a nova função multiSort() para simplificar esse processo. Com essa função, agora pode facilmente ordenar e sincronizar múltiplas coleções.
Nova função
A nova função multiSort() permite realizar uma ordenação sincronizada de vários níveis num conjunto de coleções.
Se a função for chamada sem parâmetros, ela terá o mesmo efeito que a função .sort(). Por defeito, a coleção é ordenada (apenas valores escalares) por ordem crescente, de acordo com o seu tipo.
Se quiser ordenar as colecções por outra ordem que não a ascendente, tem de fornecer uma fórmula.
$col.multiSort( [ $col2; $col3 ] )
$col .multiSort( $formula; [$col2; $col3] )
Também é possível definir uma ordenação sincronizada em vários níveis. Isto é semelhante ao comando SORT MULTIPLE ARRAY.
Neste caso, é necessário passar um objeto que contenha atributos de coleção e ordem.
$col.multiSort( [ {collection: $col2; order: ck ascending} ; $col3 ] )
$col .multiSort( [ $formula; {collection: $col2; order: ck ascending} ; $col3 ] )
Além disso, diz-se que o algoritmo de ordenação é estável, ou seja, dois elementos com o mesmo valor aparecem pela mesma ordem na saída ordenada e no conjunto de dados de entrada.
Exemplos
Voltemos ao nosso exemplo de cidade, país e continente:
var $city : Collection
var $country : Collection
var $continent : Collection
$city :=["Paris"; "Lyon"; "Rabat"; "Eching"; "San Diego"]
$country :=["France"; "France"; "Morocco"; "Germany"; "US"]
$continent :=["Europe"; "Europe"; "Africa"; "Europe"; "America"]
Exemplo 1: Uma ordenação simples da primeira coleção ($continent) com sincronização das outras colecções ($country e $city)
$continent.multiSort([$country; $city])
O resultado é:
"África"; "América"; "Europa"; "Europa"; "Europa" "Marrocos"; "EUA"; "França"; "França"; "Alemanha" "Rabat"; "San Diego"; "Paris"; "Lyon"; "Eching"
Exemplo 2: Ordenação ascendente da primeira e da terceira colecções ($continent e $city), e sincronização para a segunda coleção ($country)
$continent.multiSort($country; {collection: $city; order: ck ascending})
O resultado é:
"África"; "América"; "Europa"; "Europa"; "Europa" "Morocco"; "US"; "Germany"; "France"; "France" "Rabat"; "San Diego"; "Eching"; "Lyon"; "Paris"
Exemplo 3: Fórmula de ordenação da primeira coleção ($continent) e sincronização para as outras colecções ($country e $city)
A fórmula do exemplo é simples, permitindo-lhe ordenar por ordem descendente. Mas é provável que tenha muitas ideias para fórmulas mais complexas que se adaptem às suas necessidades.
$continent.multiSort(Formula($1.value>$1.value2); [$country; $city])
O resultado é:
"Europa"; "Europa"; "Europa"; "América"; "África" "França"; "França"; "Alemanha"; "EUA"; "Marrocos" "Paris"; "Lyon"; "Eching"; "San Diego"; "Rabat"
Exemplo 4: Com colecções complexas
Também pode ser utilizado para sincronizar colecções de objectos.
var $name : : :=[] . ({ : "John"; : "Smith"}) . ({ : "Alain"; : "Martin"}) . ({ : "Jane"; : "Doe"}) . ({ : "John"; : "Doe"}) :=[] .({ : "Paris"; : "França"}) . ({ : "Lyon"; : "França"}) . ({ : "Eching"; : "Alemanha"}) . ({ : "Berlim"; : "Alemanha"}) . ( ( . . < . . ); [ ) Collection
var $address Collection
$name
$namepushfirstname lastname
$namepushfirstname lastname
$namepushfirstname lastname
$namepushfirstname lastname
$address
$addresspushcity country
$addresspushcity country
$addresspushcity country
$addresspushcity country
$namemultiSortFormula$1valuefirstname$1value2firstname$address]
O resultado é:
"Alain Martin"; "Jane Doe"; "John Smith"; "John Doe" "Lyon França"; "Eching Alemanha"; "Paris França"; "Berlim Alemanha"
Seguinte…
Para obter mais informações, consulte a documentação. Pode partilhar os seus comentários e casos de utilização no fórum.