Prefácio
Ontem à noite, eu queria adicionar um INT à tabela de dicionário da corda no aplicativo Android. Aviso específico do eclipse hoje.
Use novo SparsarArray <string> (...) para melhor desempenho
Esse aviso significa substituí -lo usando o SparsarArray para obter melhor desempenho.
Código -fonte
Como o código geral do SparsarArray é relativamente simples, primeiro mostre o código -fonte e depois analise por que o uso do SPARSARRAY tem melhor desempenho do que usar o HashMap.
Classe pública SparsaRray <e> implementa o objeto estático privado excluído = novo objeto (); * * Cria um novo SparsarArray que não é mapeado que nem sequer exigirá que qualquer allication pare o número especificado * de mapeamentos. Requisição de arlocações = Novo objeto [InitialCapacity];} msize = 0;}} @Override @suppresswarnings ("desmarcado") public SparSearRray <E> clone () {SparsarArray <e> clone = null; ) super.clone (); * Obtém o objeto MAPD da chave de especificação, ou </null </code> * Se nenhum mapeamento thest ben fez. recebe o objeto mapeado da chave especificada ou o objeto Especificar * se nenhum ping foi feito. , Msize, chave); A chave especificada, se houvesse algum. ! ;}/ ** *Remove o mapa no índice especificado ;} / ** * Remova os mapeamentos como um lote. (msize, índice+tamanho); "Sparsarray", "GC inicia" + msize; ) {Valor do objeto = valores [i]; } o ++;}} mgarbage = false; Existe um. else {i = ~ i; mkeys.length) {gc (); msize + 1); para " + n); system.arraycopy (mkeys, 0, nkeys, mkeys.length); system.arraycopy (mvalues, 0, nvalues, 0, mvalues.length); ys; mvalues = nvalues;} if (msize -I! (mValues, i, mvalues, i+1, msize -i);} mkeys [i] = chave; / Public int size () {gc ();} retorna msize;} / ** * ** * dado no ange <code> 0 ... size () -1 </code>, retorna * a chave da chave do <Code> ÍNDICE </Code> TH MAPPELO DE CHAVE-VALOR QUE ESTAS * SPARSARARAY STORES. Key e <code> keyat (size () -1) </code> retornará a tecla Larges *. Mkeys [índice];}/** * Dado um índice no intervalo <Code> 0 ... size ()- 1 </code>, retorna * o valor do <code> Índice </code> TH TENHA- Mapeamento de valor de que este * SparsarArray Stores. Associado com a menor chave e valor (tamanho () -1) </c. Índice) {if (mgarbage) {gc ();} return (e) es [index];} / * * * Dado um índice no intervalo <code> 0 ... size () -1 </code>, Define um novo valor * para o Índice <code> </code> TH Mapeamento de Valor de Tecla que este * Sparsarray ST. } mValues [index] = value;} / ** * Retorna o índice para o qual {@link {@link #keyat} retornaria a chave * especificada ou um número negativo se a tecla * especificada não for mapeada. / Public indexOfKey (int key) {if (mgarbage) {gc ();} retornar c ontanerhelpers.binarySearch (mkeys, msize, key);} / *** retorna um índice para o qual {@link #Valueat} retornaria o retorno o * Chave especificada, ou um número negativo se não há mapa para o valor * especificado. Encontre apenas um deles. if (mgarbage) {gc ();} para (i <msize; i ++) se (mvalues [i] == valor) retornar i; A partir deste SparsoRray. msize = 0; if (msize! = 0 && k <= msize -1]) {put (chave, valor); ) {int n = ArrayArTraySize (POS + 1); mkeys.Length + "para" + n); POS] = chave; Contém Itseel como um valor, o anel St "(este mapa)" * aparecerá em seu lugar. Buffer = novo StringBuilder (msize * 28); ;} Int Key = Keyat (i); else {buffer.append ("(" ("(" end ('}'); retornar buffer.toString ();}}
Primeiro, veja o construtor de SparsarArray:
/*** Cria um novo SparsarArray não contém mapeamentos. Mapeamentos. ;
Pode ser visto no construtor que o tamanho do contêiner é definido com antecedência e o tamanho padrão é 10.
Vamos dar uma olhada na operação de dados de adição:
/ ** * Adiciona um mapeamento da chave especificada ao valor especificado, * substituindo o mapeamento anterior da tecla especificada, se houver um. Binário da pesquisa (mkeys, msize, chave); {mkeys [i] = chave; , Msize, msize, chave);} if (msize> = mkeys.length) {int n = Arrayutils.idealintarysize (msize + 1); .e ("SparsarArray", "Grow" + mkeys.length + "para" + n); mValues = nvalues;} if (msize -i! 1, msize -i);
Veja o método de verificar os dados:
/** * Obtém o objeto mapeado da tecla Especificar, ou <code> null </code> * se não houver esse mapeamento. * Obtém o objeto mapeado da tecla especificada ou o objeto Especificar * se não houver tal mapa. );
Pode -se observar que, no processo de colocar dados e obter dados, um algoritmo de pesquisa de ponto duplo é chamado uniformemente.
Estático int binário risar (int [], size int, int valor) {int lo = 0; 1; ;} Else {return mid; // valor encontrado} retornar ~ lo; Pessoalmente, acho que o método de (lo + hi) >>> 1 é um pouco estranho e é melhor usar o lo + (hi -lo) / 2 diretamente.