Looplex Knowledge Base
Size
O tube size conta o número de elementos contidos em uma coleção (lista ou vetor).
Formato:
collection.size()size(collection)
Parâmetros:
- collection: coleção a ser contada. Pode ser uma variável do tipo List ou um vetor.
Retorno:
O tube devolve um número inteiro, correspondente ao número de elementos contidos na coleção (vetor ou lista).
Exemplo:
- Size no print. Considere a compra de um automóvel em uma concessionária. A descrição do automóvel é feita na struct
<dadosAutomovel>
, que contém o campo|itensAdicionais|
, um vetor de String designando os itens opcionais adicionados ao modelo.
print "Quantidade de itens adicionados: " & |dadosAutomovel.itensAdicionais|.size() & "."
Caso se queira utilizar o número por extenso, é possível combinar o tube size com expandedNumber. Adicionalmente, com o tube printIf é possível fazer as flexões gramaticais necessárias.
print "A compradora acrescentou " & expandedNumber(|dadosAutomovel.itensAdicionais|.size()) & " " & printIf(|dadosAutomovel.itensAdicionais|.size() > 1, "itens", "item") & " ao modelo padrão do automóvel."
- Size com if. Por retornar um número inteiro, o tube size torna possível a comparação do tamanho de uma coleção (vetor ou lista) com outro número, tornando seu uso possível em operadores como if, elseif e printIf. Considere uma contestação trabalhista em que o autor pede equiparação salarial. No vetor do tipo Struct
|paradigmas|
, é possível incluir os paradigmas indicados pelo autor. Com o tube size, é possível avaliar se o autor indicou mais do que um paradigma, caso para o qual é acionada a tese de multiplicidade de paradigmas.
if (|paradigmas|.size() > 1) { use BRC_MultiplicidadeDeParadigmas}
- Size com filter. O tube size faz a contagem de todos os elementos de uma coleção. Caso se queira contar apenas alguns elementos, segundo algum critério de filtragem, é possível combinar o uso de size com filter. Considere um vetor do tipo Struct de filiais de uma empresa que atua em todo o território nacional. Com o tube filter é possível filtrar apenas as filiais de determinado estado, e contar seu número com size.
print "O número de filiais em São Paulo é " & size(|filiais|.filter([this.uf] == "São Paulo")) & "."
- Size com foreach. Outro uso comum para o tube size é para a definição de conjuntos de elementos em foreach. Trata-se de uma forma alternativa de utilizar o foreach, pensando não mais nos elementos de um vetor, mas nos índices (posições) desses elementos.
Chamamos de indexação a indicação do índice, ou posição, do elemento na coleção (lista ou vetor). Sem ela, o foreach olha para cada elemento de uma coleção:
foreach(<element> IN |collection|) where (separator = "%f, %s, %p e %l") { print <element>}
Alternativamente, é possível olhar para os elementos a partir de sua posição na coleção. Para isso, é necessário fazer a indexação.
Mas como fazer isso?
Para fazer a indexação, as posições devem ser indicadas entre chaves, dentro dos pipes, e são contadas a partir do zero (considerado como primeira posição). Assim, os elementos do vetor |collection|
podem ser descritos, em ordem:
• |collection{0}| (primeiro elemento),• |collection{1}| (segundo elemento),• |collection{2}| (terceiro elemento),
...
• |collection{n-1}| (n-ésimo elemento).
Note que, para uma coleção de n elementos, os índices variam entre 0 e n-1. Ou seja, estão no intervalo [0:n-1].
Considere uma coleção de tamanho fixo 11. O índice dos elementos dessa coleção varia no intervalo [0:11-1] (ou seja, [0:10]). É possível utilizar o foreach olhando para cada índice variável <i>
dentro do intervalor [0:10]:
foreach(<i> IN [0:10]) where (separator = "%f, %s, %p e %l") { print |collection{<i>}|}
Caso o tamanho da coleção não seja fixo, como é o caso das variáveis do tipo lista e vetor cujos valores sejam atribuídos pelo usuário, é possível obtê-lo com o tube size, da seguinte forma:
|collection|.size()
Assim, utiliza-se o foreach olhando para cada índice variável <i>
dentro do intervalo [0:|collection|.size()-1]
:
foreach(<i> IN [0:|collection|.size()-1]) where (separator = "%f, %s, %p e %l") { print |collection{<i>}|}
Mas por que fazer isso? De maneira geral, usar o foreach com índices aumenta o leque de possibilidades de manipulação de vetores. Vejamos os exemplos:
4.1. Pareamento de vetores. Uma vez que olhamos para os elementos de um vetor individualmente, a partir de seus índices, é possível criar uma correspondência entre os elementos de vetores diferentes.
Considere um vetor do tipo Struct de qualificação de procuradores |procuradores|
, e um segundo vetor do tipo Text de poderes outorgados a cada procurador |poderesOutorgados|
. Fazendo o pareamento entre os dois, cada elemento do vetor de poderes corresponde a um procurador (com o mesmo índice). Assim, é possível perguntar ao usuário informações sobre cada um dos procuradores que foram preenchidos no card anterior.
foreach(<i> IN [0:|procuradores|.size()-1]) { |poderesOutorgados{<i>}|.name = "Poderes outorgados a " & |procuradores{<i>}.nome|, |poderesOutorgados{<i>}|.request = "Informe os poderes outorgados a " & |procuradores{<i>}.nome|}foreach(<i> IN [0:|procuradores|.size()-1]) where (separator = "%f\b%s\b%p\b%l") { print "Para " & |procuradores{<i>}.nome| & ", serão outorgados os poderes de: " & |poderesOutorgados{<i>}| & "."}
4.2. Enumeração de elementos. Outro uso comum desse modelo de foreach é para a enumeração de elementos de um vetor. Assim, utiliza-se o índice variável <i>
para produzir a enumeração.
Considere um vetor de String de garantias. Será usado o foreach por indexação para fazer a enumeração das garantias informadas no vetor de String |garantias|
, no formato: (1), (2), (3) etc.
Para cada elemento de índice <i>
, será utilizado o número dado por <i>+1
. Isso porque a numeração dos índices começa em zero. Assim, para que o primeiro elemento (<i> = 0)
seja indicado pelo número 1, o segundo (<i> = 1)
pelo número 2 e assim por diante, precisamos somar 1 ao índice.
print "Foram oferecidas como garantias: ",foreach(<i> IN [0:|garantias|.size()-1]) where (separator = "%f; %s; %p; e %l.") { print "(" & (<i>+1) & ") " & |garantias{<i>}|}
Caso se deseje fazer a enumeração em letras ou algarismos romanos, lembre-se que <i>
é um número inteiro, podendo ser combinado com tubes como decimal2alpha ou decimal2roman.