Combinar e classificar colecções

Tradução automática de Deepl

4D v16 R6 opens a wide range of possibilities to manage collections. MCravar duas colecçõesnuma só, clonar ou simplesmente encomendar uma colecção é tão fácil como chamar um método. Poupa tempo valioso, por exemplo, quando é necessário concatenar duas colecções, manter apenas os valores distintos, ou ordená-los.

Este artigo faz parte de uma série que demonstra como manipular as colecções utilizando os métodos adicionados em 4D v16 R6. Para saber ainda mais, descarregue o nosso exemplo de base de dados, que inclui 12 exemplos diferentes para mostrar o que se pode fazer com os métodos de recolha!

Exemplo de base de dados: Gerir colecções

Cópia de uma colecção

Cópia profunda

O copy devolve uma cópia profunda da instância de recolha. Uma cópia profunda significa que todos os elementos da colecção original são duplicados e não partilham qualquer referência com a colecção devolvida.

No exemplo abaixo, a realização de uma cópia profunda utilizando o copy acrescenta um novo elemento ao método $col2 (a copy of the first collection – $col). An elemento adicional é adicionado a $col2, however $col remains unchanged:

//criar uma colecção
$col
:=Novacolecção("a"; "b"; "c"; "d"; "e")
// fazer uma cópia profunda da primeira colecção
$col2:=$col.copiar($col)
//adicionar um novo elemento à cópia da primeira colecção
$col2.push("f")
// $col=["a", "b", "c", "d, "e"]

//
$col2=["a", "b", "c", "d, "e", "f"]

Cópia rasa

Quando se faz uma cópia superficial de uma colecção, os elementos da colecção original partilham as suas referências com a colecção devolvida. Por exemplo, se criar uma colecção, faça uma cópia rasa típica da mesma, e depois adicione um novo elemento à cópia ($col2)A colecção original ($col) também reflectirá a mudança porque $col e $col2 partilham a sua referência:

//criar uma colecção
$col
:=Novacolecção("a"; "b"; "c"; "d"; "e")
// fazer uma cópia superficial da primeira colecção
$col2:=$col

//adicionar um novo elemento à cópia da primeira colecção

$col2.push("f")
// $col2=$col=["a", "b", "c", "d, "e", "f"]

Pode criar uma cópia superficial de uma parte de uma colecção utilizando o slice método:

//create a collection
$col
:=New collection("a"; "b"; "c"; "d"; "e")
// Copy from index 2 and stop at end of collection -1
$col2 :=$col.slice(2;-1)
//$col2=[c,d]

Combinação de colecções

A concentração de duas colecções pode ser feita utilizando qualquer um dos métodos concat ou combine métodos.

O concat devolve uma nova colecção com a concatenação das duas colecções:

//create 2 collections
$col
:=Novacolecção("a"; "b"; "c")
$col2:=Novacolecção(1;2;3)
//combine as 2 colecções numa 3ª colecção
$col3:=$col.concat($col2)
//$col3=["a", "b", "c",1,2,3]

O combine adiciona cada elemento de uma colecção (passado no parâmetro) ao final da colecção original:

//create 2 collections
$col
:=Novacolecção("a"; "b"; "c")
$col2:=Novacolecção(1;2;3)
//add a 2ª colecção até ao final da primeira colecção
$col.combine($col2)
//$col=["a", "b", "c",1,2,3]

O distinct cria uma nova colecção contendo apenas valores distintos (diferentes) da colecção original:

$col:=New collection("a"; "b"; "c"; "a"; "b"; "c"; "d"; "e")
$col2 :=$col.distinct()
//$col2=[a,b,c,d,e]

Classificar uma colecção

Para ordenar uma colecção, pode utilizar o sort ou orderBy métodos. O sort modifica a colecção original, enquanto que orderBy devolve uma colecção inteiramente nova (cópia rasa), ordenada, mas não modifica a colecção original:

$col:=Novacolecção("a"; "b"; "c"; "a"; "b"; "c"; "d"; "e")
$col2:=$col.encomendarPor()
//$col2=["a", "a", "b", "b", "c", "c", "d", "e"]

//$col=
["a", "b", "c", "a", "b", "c", "d", "e"]
$col.sort()
//$col=["a", "a", "b", "b", "c", "c", "d", "e"]

Também se pode ordenar uma colecção usando sort ou orderByMethodque requer um método de call back:

$col:=Novacolecção("Laranja"; "Maçã"; "Uva"; "Pêra"; "Banana"; "Figo"; "Amora"; "Maracujá")
$col2:=$col.orderByMethod("WordLength")
//$col2=[Maracujá,Amora,Laranja,Banana,Maçã,Uva,Pêra,Figo]
$col.sort("WordLength")
//$col=[Maracujá,Amora,Laranja,Banana,Maçã,Uva,Pêra,Figo]

Onde o método WordLength callback é um dos seus métodos de projecto:

$1.resultado:=Length(String($1.valor))>Length(String($1.valor2))

Finalmente, pode fazer uma cópia profunda de uma colecção com todos os seus elementos em ordem inversa, utilizando reverse:

$col:=Novacolecção(1;3;5;2;4;6)
$col2:=$col.reverse()
//$c2=[6,4,2,5,3,1]

Fabrice Mainguené
- Proprietário do produto ->p>Fabrice Mainguené juntou-se à equipa do Programa 4D em Novembro, 2016. Como Proprietário do Produto, está encarregado de escrever as histórias dos utilizadores, traduzindo-as depois para especificações funcionais. O seu papel é também o de assegurar que a implementação da funcionalidade entregue vai ao encontro das necessidades do cliente.Após a obtenção da licenciatura em Informática no CNAM, Fabrice juntou-se a uma pequena empresa editora de software como programador Windev. Depois trabalhou para diferentes empresas nas áreas da indústria e comércio como programador Windev e web developer, bem como como consultor técnico sobre novas funcionalidades.