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:

  1. 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."
  1. 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
}
  1. 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")) & "."
  1. 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.

Edit this page on GitHub