Matrizes indexadas

Flash Player 9 e posterior, Adobe AIR 1.0 e posterior

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