As matrizes indexadas armazenam uma série de um ou mais valores organizados de tal maneira que cada valor pode ser acessado com um valor inteiro sem sinal. O primeiro índice é sempre o número 0 e o índice aumenta em incrementos de 1 para cada elemento subsequente adicionado à matriz. No ActionScript 3.0, duas classes são usadas como matrizes indexadas: classes Array e Vector.
As matrizes indexadas usam um inteiro de 32 bits sem sinal como número do índice. O tamanho máximo de uma matriz indexada é 2
32
- 1 ou 4.294.967.295. Uma tentativa de criar uma matriz maior que o tamanho máximo resulta em um erro de tempo de execução.
Para acessar um elemento individual de uma matriz indexada, use o operador de acesso à matriz (
[]
) para especificar a posição de índice do elemento que deseja acessar. Por exemplo, o código a seguir representa o primeiro elemento (o elemento no índice 0) em uma matriz indexada chamada
songTitles
:
songTitles[0]
A combinação do nome da variável de matriz seguido pelo índice entre colchetes funciona como um identificador único (em outras palavras, ele pode ser usado da mesma forma que um nome de variável). Você pode atribuir um valor para um elemento de matriz indexada usando o nome e o índice à esquerda de uma instrução de atribuição:
songTitles[1] = "Symphony No. 5 in D minor";
Da mesma forma, você pode recuperar o valor de um elemento de matriz indexada usando o nome e o índice à direita de uma instrução de atribuição:
var nextSong:String = songTitles[2];
Você também pode usar uma variável entre colchetes em vez de fornecer um valor explícito (a variável deve conter um valor inteiro não negativo como uint, um número inteiro positivo ou uma instância de Number de um número inteiro positivo). Geralmente, essa técnica é usada para fazer um loop dos elementos de uma matriz indexada e executar uma operação em alguns ou todos os elementos. A lista de códigos a seguir demonstra essa técnica: O código usa um loop para acessar cada valor em um objeto Array denominado
oddNumbers
. Ele usa a instrução
trace()
para imprimir cada valor da fórmula “oddNumber[
index
] =
value
”:
var oddNumbers:Array = [1, 3, 5, 7, 9, 11];
var len:uint = oddNumbers.length;
for (var i:uint = 0; i < len; i++)
{
trace("oddNumbers[" + i.toString() + "] = " + oddNumbers[i].toString());
}
Classe Array
A classe Array é o primeiro tipo de matriz indexada. Uma ocorrência de Array pode armazenar valores de qualquer tipo de dados. O mesmo objeto Array pode armazenar objetos de diferentes tipos de dados. Por exemplo, uma única ocorrência de Array pode ter um valor String no índice 0, uma instância de Number no índice 1 e um objeto XML no índice 2.
Classe Vector
A classe Vector corresponde a outro tipo de matriz indexada que está disponível no ActionScript 3.0. Uma ocorrência de Vector é uma
matriz tipificada
, o que significa que todos os elementos dessa ocorrência possuem o mesmo tipo de dados.
Nota:
A classe Vector está disponível a partir do Flash Player 10 e do Adobe AIR 1.5.
Quando você declara uma variável Vector ou cria ocorrência de um objeto Vector, está especificando explicitamente os tipos de dados dos objetos que o vetor pode conter. O tipo de dados especificado é conhecido como o
tipo base
do vetor. Nos tempos de execução e de compilação (no modo restrito), qualquer código que define o valor de um elemento Vector ou recupera um valor de um vetor é verificado. Se o tipo de dados do objeto que está sendo adicionado ou recuperado não corresponder ao tipo base do vetor, ocorrerá um erro.
Além da restrição de tipo de dados, a classe Vector tem outras restrições que a diferenciam da classe Array:
-
Um vetor é uma matriz densa. Um objeto Array pode ter valores nos índices 0 e 7, mesmo se não tiver valores nas posições de 1 a 6. Entretanto, um vetor deve ter um valor (ou
null
) em cada índice.
-
Um vetor pode ter tamanho fixo, opcionalmente. Isso significa que o número de elementos contidos no vetor não pode ser alterado.
-
Os limites de acesso aos elementos de um vetor são verificados. Não é possível ler um valor de um índice maior que o elemento final (
tamanho - 1
). Nunca defina um valor com um índice que exceda o índice final atual (em outras palavras, você só pode definir um valor em um índice existente ou no índice
[length]
).
Como resultado das restrições, uma instância Vector tem duas vantagens principais sobre uma instância de Matriz cujos elementos são instâncias de uma única classe:
-
Desempenho: a iteração e o acesso ao elemento da matriz são muito mais rápidos ao usar uma ocorrência de Vector do que ao usar uma de Array.
-
Segurança do tipo: o compilador pode identificar erros de tipo de dados no modo restrito. Exemplos de erros desse tipo incluem a atribuição de valor de um tipo de dados incorreto ao um vetor ou a espera do tipo de dados errado na leitura de um valor de um vetor. Em tempo de execução, os tipos de dados também são verificados durante a adição ou leitura de dados de um objeto Vector. Observe, entretanto, que ao usar o método
push()
ou
unshift()
para adicionar valores a um vetor, os tipos de dados dos argumentos não são verificados durante a compilação. Quando usar esses métodos, os valores serão verificados no tempo de execução.
-
Confiabilidade: a verificação de intervalo de tempo de execução (ou a verificação de comprimento fixo) aumenta a confiabilidade significativamente nas Matrizes.
Com exceção das restrições adicionais e vantagens, a classe Vector é muito parecida com a classe Array. As propriedades e os métodos de um objeto Vector são semelhantes — em grande parte, idênticos — aos de um Array. Na maioria dos casos, quando você usa uma Matriz em que todos os elementos têm o mesmo tipo de dados, uma instância de Vector tem preferência.
Criação de matrizes
É possível usar diversas técnicas para criar uma instância de Array ou Vector. No entanto, as técnicas para criação de cada tipo de matriz apresentam diferenças entre si.
Criação de uma ocorrência de Array
É possível criar um objeto Array ao chamar o construtor
Array()
ou ao usar a sintaxe literal de matriz.
A função de construtor
Array()
pode ser usada de três modos: Primeiro, se você chama o construtor sem nenhum argumento, obtém uma matriz vazia. Você pode usar a propriedade
length
da classe Array para verificar se a matriz não tem nenhum elemento. Por exemplo, o código a seguir chama o construtor
Array()
sem nenhum argumento:
var names:Array = new Array();
trace(names.length); // output: 0
Segundo, se você usar um número como o único parâmetro do construtor
Array()
, uma matriz com esse comprimento será criada, com o valor de cada elemento definido como
undefined
. O argumento deve ser um número inteiro sem sinal entre os valores 0 e 4.294.967.295. Por exemplo, o código a seguir chama o construtor
Array()
com um único argumento numérico:
var names:Array = new Array(3);
trace(names.length); // output: 3
trace(names[0]); // output: undefined
trace(names[1]); // output: undefined
trace(names[2]); // output: undefined
Terceiro, se você chama o construtor e transmite uma lista de elementos como parâmetros, uma matriz com elementos correspondem a cada parâmetro é criada. O código a seguir transmite três argumentos para o construtor
Array()
:
var names:Array = new Array("John", "Jane", "David");
trace(names.length); // output: 3
trace(names[0]); // output: John
trace(names[1]); // output: Jane
trace(names[2]); // output: David
Você também pode criar matrizes com literais de matriz. Um literal de matriz pode ser atribuído diretamente a uma variável de matriz, como mostra o exemplo a seguir:
var names:Array = ["John", "Jane", "David"];
Criação de uma ocorrência de Vector
Você pode criar uma ocorrência de Vector ao chamar o construtor
Vector.<T>()
. Você também pode criar um vetor ao chamar a função global
Vector.<T>()
. Essa função converte um objeto especificado em uma ocorrência de Vector. No Flash Professional CS5 e posterior, Flash Builder 4 e posterior, e Flex 4 e posterior, você também pode criar uma instância de vetor usando a sintaxe literal Vector.
Quando você declara uma variável de vetor (ou do mesmo modo, um parâmetro de método de vetor ou um tipo de retorno de método), está especificando o tipo base da variável de vetor. O tipo base também é especificado quando você cria uma ocorrência de Vector ao chamar o construtor
Vector.<T>()
. Em outras palavras, sempre que usar o termo
Vector
no ActionScript, ele estará acompanhado por um tipo base.
O tipo base do vetor é especificado por meio de uma sintaxe de parâmetro de tipo. O parâmetro de tipo segue imediatamente a palavra
Vector
no código. Esse parâmetro consiste em um ponto (
.
), seguido do nome de classe base entre colchetes angulares (
<>
), conforme apresentado no exemplo a seguir:
var v:Vector.<String>;
v = new Vector.<String>();
Na primeira linha do exemplo, a variável
v
está declarada como uma ocorrência de
Vector.<String>
. Em outras palavras, ela representa uma matriz indexada que pode conter apenas ocorrências de String. A segunda linha chama o construtor
Vector()
para criar uma ocorrência do mesmo tipo de vetor, ou seja, um vetor cujos elementos são objetos String. Esse construtor atribui o objeto a
v
.
Uso do construtor Vector.<T>() construtor
Caso você use o construtor
Vector.<T>()
sem quaisquer argumentos, uma ocorrência de Vector vazia será criada. Você pode verificar se um vetor está vazio ao conferir sua propriedade
length
. Por exemplo, o código a seguir chama o construtor
Vector.<T>()
sem argumentos:
var names:Vector.<String> = new Vector.<String>();
trace(names.length); // output: 0
Você pode predefinir a quantidade de elementos que um vetor precisa ter inicialmente, se tiver essa informação antecipadamente. Para criar um vetor com um determinado número de elementos, transfira o número de elementos como o primeiro parâmetro (o parâmetro
length
). Os elementos Vector são preenchidos com ocorrências do tipo base, já que não podem ficar vazios. Se o tipo base é um tipo de referência que permite valores
null
, todos os elementos conterão
null
. Caso contrário, os elementos conterão o valor padrão para a classe. Por exemplo, uma variável uint não pode ser
null
. Consequentemente, o código a seguir que lista o vetor chamado
ages
é criado com sete elementos contendo o valor 0:
var ages:Vector.<uint> = new Vector.<uint>(7);
trace(ages); // output: 0,0,0,0,0,0,0
Por fim, ao usar o construtor
Vector.<T>()
, você também poderá criar um vetor de tamanho fixo ao passar
true
para o segundo parâmetro (o parâmetro
fixed
). Nesse caso o vetor é criado com o número de elementos especificado e esse número não pode ser alterado. Note, no entanto, que ainda será possível mudar os valores dos elementos de um vetor de tamanho fixo.
Como utilizar o construtor de sintaxe literal Vector
No Flash Professional CS5 e posterior, Flash Builder 4 e posterior e no Flex 4 e posterior, você pode transmitir uma lista de valores ao construtor
Vector.<T>()
para especificar os valores iniciais do vetor:
// var v:Vector.<T> = new <T>[E0, ..., En-1 ,];
// For example:
var v:Vector.<int> = new <int>[0,1,2,];
As seguintes informações se aplicam a esta sintaxe:
-
A vírgula posterior é opcional.
-
Os itens vazios na matriz não são suportados; uma instrução como
var v:Vector.<int> = new <int>[0,,2,]
emite um erro de compilador.
-
Você não pode especificar um comprimento padrão da instância Vector. Em vez disso, o comprimento é o mesmo que o número de elementos na lista de inicialização.
-
Você não pode especificar se a instância Vector tem um comprimento fixo. Em vez disso, use a propriedade
fixed
.
-
A perda de dados ou os erros podem ocorrer se os itens passaram como os valores que não correspondem ao tipo especificado. Por exemplo:
var v:Vector.<int> = new <int>[4.2]; // compiler error when running in strict mode
trace(v[0]); //returns 4 when not running in strict mode
Uso do construtor Vector.<T>() função global
Além do construtor
Vector.<T>()
e construtores da sintaxe literal Vector, você também pode usar o
Vector.<T>()
para criar um objeto Vector. A função global
Vector.<T>()
é uma função de conversão. Quando a função global
Vector.<T>()
é chamada, você está especificando o tipo base do vetor que o método retorna. Com isso, uma única matriz indexada (ocorrência de Array ou Vector) é passada como um argumento. Em seguida, o método retorna um vetor com o tipo base especificado, contendo os valores do argumento da matriz de origem. A listagem de código a seguir exibe a sintaxe necessária para chamar a função global
Vector.<T>()
:
var friends:Vector.<String> = Vector.<String>(["Bob", "Larry", "Sarah"]);
A função global
Vector.<T>()
executa a conversão do tipo de dados em dois níveis. Primeiro, uma ocorrência de Vector é retornada quando uma ocorrência de Array é passada para a função. Segundo, quando a matriz de origem é uma ocorrência de Array ou Vector, a função tenta converter os elementos da matriz de origem em valores do tipo base. A conversão usa regras de conversão de tipo de dados padrão do ActionScript. Por exemplo, a listagem de código a seguir converte os valores de string na matriz de origem para números inteiros no vetor resultante. A parte decimal do primeiro valor (
"1.5"
) está truncada e o terceiro valor não numérico (
"Waffles"
) é convertido para 0 no resultado:
var numbers:Vector.<int> = Vector.<int>(["1.5", "17", "Waffles"]);
trace(numbers); // output: 1,17,0
Se não for possível converter nenhum dos elementos de origem, ocorrerá um erro.
Quando o código chama a função global
Vector.<T>()
, se um elemento da matriz de origem é uma ocorrência de uma subclasse do tipo base especificado, o elemento é adicionado ao vetor resultante (não há ocorrência de erros). O uso da função global
Vector.<T>()
é o único modo de converter um vetor com tipo base
T
em um vetor com tipo base que seja uma superclasse de
T
.
Inserção de elementos de matriz
A maneira mais simples de adicionar um elemento a uma matriz indexada é usar o operador de acesso à matriz (
[]
). Para definir um valor de um elemento de matriz indexada, use o nome de objeto Array ou Vector e o número de índice à esquerda de uma instrução de atribuição:
songTitles[5] = "Happy Birthday";
Se a matriz ou o vetor ainda não tiver um elemento no índice, esse índice será criado e o valor será armazenado nele. Se houver um valor no índice, o novo valor substituirá o existente.
Um objeto Array permite a criação de um elemento em qualquer índice. Entretanto, com um objeto Vector você somente poderá atribuir um valor a um índice existente ou ao próximo índice disponível. O próximo índice disponível corresponde à propriedade
length
do objeto Vector. A maneira mais segura de adicionar um novo elemento a um objeto Vector é usar um código como na listagem a seguir:
myVector[myVector.length] = valueToAdd;
Três métodos da classe Array e Vector -
push()
,
unshift()
e
splice()
- permitem inserir elementos em uma matriz indexada. O método
push()
anexa um ou mais elementos ao final de uma matriz. Em outras palavras, o último elemento inserido na matriz com o método
push()
terá o maior número de índice. O método
unshift()
insere um ou mais elementos no início de uma matriz, sempre no número de índice 0. O método
splice()
insere qualquer número de itens em um índice especificado na matriz.
O exemplo a seguir demonstra os três métodos. Uma matriz chamada
planetas
é criada para armazenar os nomes dos planetas de acordo com a proximidade ao Sol. Primeiro, o método
push()
é chamado para adicionar o item inicial,
Marte
. Segundo, o método
unshift()
é chamado para inserir o item que pertence ao início da matriz,
Mercúrio
. Finalmente, o método
splice()
é chamado para inserir os itens
Vênus
e
Terra
depois de
Mercúrio
, mas antes de
Marte
. O primeiro argumento enviado para
splice()
, o inteiro 1, direciona a inserção para começar no índice 1. O segundo argumento enviado para
splice()
, o inteiro 0, indica que nenhum item deve ser excluído. Finalmente, o terceiro e quarto argumentos enviados para
splice()
,
Vênus
e
Terra
, são os itens que devem ser inseridos.
var planets:Array = new Array();
planets.push("Mars"); // array contents: Mars
planets.unshift("Mercury"); // array contents: Mercury,Mars
planets.splice(1, 0, "Venus", "Earth");
trace(planets); // array contents: Mercury,Venus,Earth,Mars
Os métodos
push()
e
unshift()
retornam um inteiro sem sinal que representa o comprimento da matriz modificada. O método
splice()
retorna uma matriz vazia quando é usado para inserir elementos, o que pode parecer estranho, mas faz mais sentido de acordo com a versatilidade do método
splice()
. Você pode usar o método
splice()
não só para inserir elementos em uma matriz, mas também para remover elementos de uma matriz. Quando usado para remover elementos, o método
splice()
retorna uma matriz que contém os elementos removidos.
Nota:
Se a propriedade
fixed
do objeto Vector for
true
, o número total de elementos do vetor não poderá ser alterado. Se você tentar adicionar um novo elemento a um vetor de tamanho fixo por meio de técnicas aqui descritas, ocorrerá um erro.
Recuperação de valores e remoção de elementos de matriz
A maneira mais simples de recuperar o valor de um elemento de uma matriz indexada é usar o operador de acesso à matriz (
[]
). Para recuperar o valor de um elemento de matriz indexada, use o nome de objeto Array ou Vector e o número de índice à direita de uma instrução de atribuição:
var myFavoriteSong:String = songTitles[3];
Você pode tentar recuperar um valor de uma matriz ou vetor usando um índice onde não houver elementos. Nesse caso, um objeto Array retorna um valor indefinido e um vetor emite uma exceção RangeError.
Três métodos das classes Array e Vector -
pop()
,
shift()
e
splice()
- permitem a remoção de elementos. O método
pop()
remove um elemento do final da matriz. Em outras palavras, ele remove o elemento com o número de índice mais alto. O método
shift()
remove um elemento do início da matriz, ou seja, sempre remove o elemento com o número de índice 0. O método
splice()
, que também pode ser usado para inserir elementos, remove um número arbitrário de elementos começando no número de índice especificado pelo primeiro argumento enviado ao método.
O exemplo a seguir usa os três métodos para remover elementos de uma ocorrência de Array. Uma matriz chamada
oceanos
é criada para armazenar os nomes dos grandes corpos de água. Alguns nomes da matriz referem-se a lagos, não a oceanos, e precisam ser removidos.
Primeiro, o método
splice()
é usado para remover os itens
Aral
e
Superior
, e inserir os itens
Atlântico
e
Índico
. O primeiro argumento enviado para
splice()
, o inteiro 2, indica que a operação deve começar com o terceiro item da lista, que está no índice 2. O segundo argumento, 2, indica que dois itens devem ser removidos. Os argumentos restantes,
Atlântico
e
Índico
, são os valores que devem ser inseridos no índice 2.
Segundo, o método
pop()
é usado para remover o último elemento da matriz,
Huron
. Finalmente, o método
shift()
é usado para remover o primeiro item da matriz,
Vitória
.
var oceans:Array = ["Victoria", "Pacific", "Aral", "Superior", "Indian", "Huron"];
oceans.splice(2, 2, "Arctic", "Atlantic"); // replaces Aral and Superior
oceans.pop(); // removes Huron
oceans.shift(); // removes Victoria
trace(oceans);// output: Pacific,Arctic,Atlantic,Indian
Os métodos
pop()
e
shift()
retornam o item que foi removido. Para uma ocorrência de Array, o tipo de dados do valor de retorno é Object porque as matrizes podem armazenar valores de qualquer tipo de dados. Para uma ocorrência de Vector, o tipo de dados do valor de retorno é o tipo base do vetor. O método
splice()
retorna uma matriz ou um vetor que contém os valores removidos. Você pode alterar o exemplo de matriz
oceanos
para que a chamada do método
splice()
atribua a matriz retornada a uma nova variável Array, como mostra o exemplo a seguir:
var lakes:Array = oceans.splice(2, 2, "Arctic", "Atlantic");
trace(lakes); // output: Aral,Superior
Talvez apareça um código que usa o operador
delete
em um elemento de objeto Array. O operador
delete
define o valor de um elemento Array como
undefined
, mas não remove o elemento da matriz. Por exemplo, o código a seguir usa o operador
delete
no terceiro elemento da matriz
oceanos
, mas o comprimento da matriz continua sendo 5:
var oceans:Array = ["Arctic", "Pacific", "Victoria", "Indian", "Atlantic"];
delete oceans[2];
trace(oceans);// output: Arctic,Pacific,,Indian,Atlantic
trace(oceans[2]); // output: undefined
trace(oceans.length); // output: 5
Você pode truncar uma matriz ou um vetor usando uma propriedade de matriz
length
. Se a propriedade
length
de uma matriz indexada for definida como um comprimento menor do que o atual, a matriz será truncada, o que remove os elementos armazenados nos números de índice maiores do que o novo valor de
length
menos 1. Por exemplo, se a matriz
oceanos
fosse classificada de modo que todas as entradas válidas estivessem no início da matriz, a propriedade
length
poderia ser usada para remover as entradas no final da matriz, como mostra o código a seguir:
var oceans:Array = ["Arctic", "Pacific", "Victoria", "Aral", "Superior"];
oceans.length = 2;
trace(oceans); // output: Arctic,Pacific
Nota:
Se a propriedade
fixed
do objeto Vector for
true
, o número total de elementos do vetor não poderá ser alterado. Se você tentar remover um elemento ou truncar um vetor de tamanho fixo usando as técnicas aqui descritas, ocorrerá um erro.
Classificação de uma matriz
Existem três métodos -
reverse()
,
sort()
e
sortOn()
- que permitem alterar a ordem de uma matriz indexada, classificando-a ou invertendo-a. Todos esses métodos modificam a matriz existente. A tabela a seguir resume esses métodos e seus respectivos comportamentos para objetos Array e Vector:
Método
|
Comportamento de Array
|
Comportamento de Vector
|
reverse()
|
Altera a ordem dos elementos de modo de que o último elemento se transforma no primeiro, o penúltimo no segundo e assim por diante.
|
Idêntico ao comportamento de Array
|
sort()
|
Permite a classificação dos elementos da matriz de diversos modos predefinidos, como ordem alfabética ou numérica. Também é possível especificar um algoritmo de classificação personalizada.
|
Classifica os elementos de acordo com o algoritmo de classificação personalizada especificado
|
sortOn()
|
Permite a classificação de objetos que possuem uma ou mais propriedades em comum, especificando a(s) propriedade(s) que podem ser usadas como chaves de classificação.
|
Indisponível na classe Vector.
|
O método reverse()
O método
reverse()
não assume nenhum parâmetro e não retorna um valor, mas permite alternar a ordem da matriz do estado atual para a ordem inversa. O exemplo a seguir inverte a ordem dos oceanos listados na matriz
oceanos
:
var oceans:Array = ["Arctic", "Atlantic", "Indian", "Pacific"];
oceans.reverse();
trace(oceans); // output: Pacific,Indian,Atlantic,Arctic
Classificação básica com o método sort() (somente para a classe Array)
Para uma ocorrência de Array, o método
sort()
reorganiza os elementos de uma matriz usando a
ordem de classificação padrão
. A ordem de classificação padrão deve ter as seguintes características:
-
A classificação diferencia maiúsculas de minúsculas, isto é, os caracteres maiúsculos precedem os minúsculos. Por exemplo, a letra D precede a letra b.
-
A classificação é crescente, ou seja, os códigos de caracteres menores (como A) precedem os maiores (como B).
-
A classificação coloca valores idênticos perto um do outro, mas não em uma ordem específica.
-
A classificação baseia-se em strings, ou seja, os elementos são convertidos em strings antes de serem comparados (por exemplo, 10 vem antes de 3 porque a string
"1"
tem um código de caractere menor do que o da string
"3"
).
Talvez você precise classificar uma matriz sem diferenciar maiúsculas de minúsculas, em ordem decrescente ou sua matriz pode conter elementos que devem ser classificados numericamente em vez de em ordem alfabética. O método
sort()
de classe Array tem um parâmetro
options
que permite a alteração de cada característica da ordem de classificação padrão. As opções são definidas por um conjunto de constantes estáticas da classe Array, como mostra a lista a seguir:
-
Array.CASEINSENSITIVE
: essa opção não diferencia maiúsculas de minúsculas durante a classificação. Por exemplo, a letra minúscula b precede a letra maiúscula D.
-
Array.DESCENDING:
essa opção inverte a classificação crescente padrão. Por exemplo, a letra B precede a letra A.
-
Array.UNIQUESORT:
essa opção interrompe a classificação quando dois valores idênticos são encontrados.
-
Array.NUMERIC:
essa opção faz a classificação numérica, de modo que 3 vem antes de 10.
O exemplo a seguir destaca algumas dessas opções. Uma matriz chamada
poetas
é criada e classificada com diversas opções diferentes.
var poets:Array = ["Blake", "cummings", "Angelou", "Dante"];
poets.sort(); // default sort
trace(poets); // output: Angelou,Blake,Dante,cummings
poets.sort(Array.CASEINSENSITIVE);
trace(poets); // output: Angelou,Blake,cummings,Dante
poets.sort(Array.DESCENDING);
trace(poets); // output: cummings,Dante,Blake,Angelou
poets.sort(Array.DESCENDING | Array.CASEINSENSITIVE); // use two options
trace(poets); // output: Dante,cummings,Blake,Angelou
Classificação padrão com o método sort() (somente para as classes Array e Vector)
Além da classificação básica disponível para um objeto Array, também é possível definir uma regra de classificação personalizada. Essa técnica é a única forma do método
sort()
disponível para a classe Vector. Para definir uma classificação padrão, escreva uma função de classificação personalizada e passe-a como um argumento para o método
sort()
.
Por exemplo, se houver uma lista de nomes e cada elemento da lista tiver o nome completo da pessoa, mas você quiser classificar a lista pelo sobrenome, use uma função de classificação personalizada para analisar cada elemento e use o sobrenome na função de classificação. O código a seguir mostra como isso pode ser feito com uma função personalizada que é usada como um parâmetro para o método
Array.sort()
:
var names:Array = new Array("John Q. Smith", "Jane Doe", "Mike Jones");
function orderLastName(a, b):int
{
var lastName:RegExp = /\b\S+$/;
var name1 = a.match(lastName);
var name2 = b.match(lastName);
if (name1 < name2)
{
return -1;
}
else if (name1 > name2)
{
return 1;
}
else
{
return 0;
}
}
trace(names); // output: John Q. Smith,Jane Doe,Mike Jones
names.sort(orderLastName);
trace(names); // output: Jane Doe,Mike Jones,John Q. Smith
A função de classificação personalizada
orderLastName()
usa uma expressão regular para extrair o sobrenome de cada elemento a ser usado para a operação de comparação. O identificador da função
orderLastName
é usado como o único parâmetro ao chamar o método
sort()
na matriz
nomes
. A função de classificação aceita dois parâmetros,
a
e
b
, porque atua em dois elementos de matriz ao mesmo tempo. O valor de retorno da função de classificação indica como os elementos devem ser classificados:
-
O valor de retorno -1 indica que o primeiro parâmetro,
a
, precede o segundo,
b
.
-
O valor de retorno 1 indica que o segundo parâmetro,
b
, precede o primeiro,
a
.
-
O valor de retorno 0 indica que os elementos têm a mesma precedência de classificação.
O método sortOn() (somente para a classe Array)
O método
sortOn()
foi desenvolvido para objetos Array com elementos que contêm objetos. Esses objetos devem ter pelo menos uma propriedade comum que pode ser usada como a chave de classificação. O uso do método
sortOn()
para outros tipos de matriz gera resultados inesperados.
Nota:
A classe Vector não inclui um método
sortOn()
. Esse método está disponível apenas para objetos Array.
O exemplo a seguir revisa a matriz
poetas
para que cada elemento seja um objeto, em vez de uma string. Cada objeto armazena o sobrenome e o ano de nascimento do poeta.
var poets:Array = new Array();
poets.push({name:"Angelou", born:"1928"});
poets.push({name:"Blake", born:"1757"});
poets.push({name:"cummings", born:"1894"});
poets.push({name:"Dante", born:"1265"});
poets.push({name:"Wang", born:"701"});
Você pode usar o método
sortOn()
para classificar a matriz pela propriedade
born
. O método
sortOn()
define dois parâmetros,
fieldName
e
options
. O argumento
fieldName
deve ser especificado como uma string. No exemplo a seguir,
sortOn()
é chamado com dois argumentos, "
born"
e
Array.NUMERIC
. O argumento
Array.NUMERIC
é usado para assegurar que a classificação seja feita numericamente, não em ordem alfabética. Isso é útil mesmo quando todos os números têm o mesmo número de dígitos porque garante que a classificação continuará apresentando o comportamento esperado se um número com mais ou menos dígitos for adicionado posteriormente à matriz.
poets.sortOn("born", Array.NUMERIC);
for (var i:int = 0; i < poets.length; ++i)
{
trace(poets[i].name, poets[i].born);
}
/* output:
Wang 701
Dante 1265
Blake 1757
cummings 1894
Angelou 1928
*/
Classificação sem modificação da matriz original (somente para a classe Array)
Geralmente, os métodos
sort()
e
sortOn()
modificam uma matriz. Se desejar classificar uma matriz sem modificar a existente, transmita a constante
Array.RETURNINDEXEDARRAY
como parte do parâmetro
options
. Essa opção instrui os métodos a retornar uma nova matriz que reflete a classificação e deixar a matriz original inalterada. A matriz retornada pelos métodos é uma simples matriz de números de índice que reflete a nova ordem de classificação e não contém nenhum elemento da matriz original. Por exemplo, para classificar a matriz
poetas
por ano de nascimento sem modificá-la, inclua a constante
Array.RETURNINDEXEDARRAY
como parte do argumento transmitido para o parâmetro
options
.
O exemplo a seguir armazena as informações de índice retornadas em uma matriz chamada
índices
e usa a matriz
índices
junto com a matriz
poetas
inalterada para classificar os poetas por ano de nascimento:
var indices:Array;
indices = poets.sortOn("born", Array.NUMERIC | Array.RETURNINDEXEDARRAY);
for (var i:int = 0; i < indices.length; ++i)
{
var index:int = indices[i];
trace(poets[index].name, poets[index].born);
}
/* output:
Wang 701
Dante 1265
Blake 1757
cummings 1894
Angelou 1928
*/
Consulta de uma matriz
Quatro métodos das classes Array e Vector -
concat()
,
join()
,
slice()
e
toString()
- consultam a matriz em busca de informações, mas não a modificam. Os métodos
concat()
e
slice()
retornam novas matrizes, enquanto os métodos
join()
e
toString()
retornam strings. O método
concat()
pega uma nova matriz ou lista de elementos como argumentos e a combina com a matriz existente para criar uma nova. O método
slice()
tem dois parâmetros, devidamente chamados de
startIndex
e
endIndex
, e retorna uma nova matriz que contém uma cópia dos elementos "fatiados" a partir da matriz existente. A fatia começa com o elemento em
startIndex
e termina com o elemento bem antes de
endIndex
. A máxima é a mesma: O elemento em
endIndex
não é incluído no valor de retorno.
O exemplo a seguir usa
concat()
e
slice()
para criar novas matrizes com elementos de outras matrizes:
var array1:Array = ["alpha", "beta"];
var array2:Array = array1.concat("gamma", "delta");
trace(array2); // output: alpha,beta,gamma,delta
var array3:Array = array1.concat(array2);
trace(array3); // output: alpha,beta,alpha,beta,gamma,delta
var array4:Array = array3.slice(2,5);
trace(array4); // output: alpha,beta,gamma
Você pode usar os métodos
join()
e
toString()
para consultar a matriz e retornar seu conteúdo como uma string. Se nenhum parâmetro for usado para o método
join()
, os dois métodos terão o mesmo comportamento: eles retornarão uma string que contém uma lista delimitada por vírgulas de todos os elementos da matriz. O método
join()
, diferente do método
toString()
, aceita um parâmetro chamado
delimiter
, que permite escolher o símbolo a ser usado como separador entre cada elemento na string retornada.
O exemplo a seguir cria uma matriz chamada
rios
e chama
join()
e
toString()
para retornar os valores na matriz como uma string. O método
toString()
é usado para retornar valores separados por vírgula (
riverCSV
), enquanto o método
join()
é usado para retornar valores separados pelo caractere
+
.
var rivers:Array = ["Nile", "Amazon", "Yangtze", "Mississippi"];
var riverCSV:String = rivers.toString();
trace(riverCSV); // output: Nile,Amazon,Yangtze,Mississippi
var riverPSV:String = rivers.join("+");
trace(riverPSV); // output: Nile+Amazon+Yangtze+Mississippi
Um problema do método
join()
que deve ser levado em consideração é o fato de as ocorrências de Array ou Vector aninhadas sempre serem retornadas com valores separados por vírgula, independentemente do separador especificado para os elementos principais da matriz, como mostra o exemplo a seguir:
var nested:Array = ["b","c","d"];
var letters:Array = ["a",nested,"e"];
var joined:String = letters.join("+");
trace(joined); // output: a+b,c,d+e
|
|
|