Estou tentando construir um HashMap que terá inteiros como chaves e objetos como valores.
Minha sintaxe é:
HashMap<int, myObject> myMap = new HashMap<int, myObject>();
No entanto, o erro retornado é - Erro de sintaxe no token "int", Dimensões esperadas após este token - Não entendo por que devo adicionar uma dimensão (ou seja: transformar o int em uma matriz), pois só preciso armazenar um dígito como chave.
O que eu poderia fazer?
Desde já, obrigado! :)
HashMap
não lida com primitivos, apenas objetos.int
sendo o valor, não a chave.Integer
lugar.Respostas:
Você não pode usar uma primitiva porque o HashMap usa o objeto internamente para a chave. Portanto, você só pode usar um objeto que herda de Object (ou seja, qualquer objeto).
Essa é a função put () em HashMap e como você pode ver, ela usa Object para K:
A expressão "k = e.key" deve deixar isso claro.
Eu sugiro usar um wrapper como Integer e autoboxing.
fonte
Use em seu
Integer
lugar.Java irá autobox automaticamente seus
int
valores primitivos paraInteger
objetos.Leia mais sobre autoboxing nas documentações do Oracle Java.
fonte
myObject
ArrayMap
ouSimpleArrayMap
no Android para economizar memória e aumentar o desempenho ( Mais informações )Para todos que codificam Java para dispositivos Android e acabam aqui: use
SparseArray
para melhor desempenho;com isso você pode usar int em vez de Integer like;
fonte
SparseArray
Se você alocar um monte de ints de boxing e unboxing de memória como faria com umHashMap
, o VM precisará pausar a execução para a coleta de lixo mais cedo. Isso é importante se você estiver tentando fazer algo com frequência e rapidez.SparseArray
é O (n) (HashMap
tem O (1) ). É importante quando o número de elementos é grande. A inserção no início dessa matriz é muito mais lenta.put()
levaO(n)
(nãon log n
) para inserção no início porque encontra a posição e, em seguida, desloca todos os elementos seguintes.delete()
em si de fato levaO(log n)
, mas a próxima inserção ou iteração por meio de elementos após a exclusão exigirá uma coleta de lixo que levaO(n)
.Você pode tentar usar Trove http://trove.starlight-systems.com/
TIntObjectHashMap é provavelmente o que você está procurando.
fonte
O principal motivo do HashMap não permitir primitivas como chaves é que o HashMap é projetado de tal forma que, para comparar as chaves, faz uso do método equals () , e um método pode ser chamado apenas em um objeto que não está em uma primitiva.
Assim, quando int é autoboxed para Integer, o Hashmap pode chamar o método equals () no objeto Integer.
É por isso que você deve usar Integer em vez de int. Quer dizer, o hashmap lança um erro ao colocar int como uma chave (não sei o significado do erro que é lançado)
E se você pensa assim, pode tornar o desempenho do Map mais rápido tornando uma primitiva como chave, há uma biblioteca chamada FastUtil que contém uma implementação de Map com tipo int como chave.
Por causa disso, é muito mais rápido que o Hashmap
fonte
Map<Integer, String>
transformaMap<Object, Object>
durante a compilação. BTW, existe IdentityHashMap que usa==
operador para verificação de igualdade, que ainda não permite tipos primitivos.O HashMap não permite tipos de dados primitivos como argumentos. Ele só pode aceitar objetos então
não funciona.
Você tem que alterar a declaração para
então, mesmo quando você faz o seguinte
O tipo de dados primitivo é autoboxed para um objeto Integer.
Você pode ler mais sobre autoboxing aqui http://docs.oracle.com/javase/tutorial/java/data/autoboxing.html
fonte
Se você codifica no Android, existe SparseArray , mapeando inteiro para objeto.
fonte
use int como objeto, não como tipo primitivo
fonte
-1
. Ao contrário de outros comentar antes de penalizar (eu não fiz -1 você).Por favor, use
HashMap<Integer, myObject> myMap = new HashMap<Integer, myObject>();
fonte
Um array também é um Object, portanto
HashMap<int[], MyObject>
é uma construção válida que usa arrays int como chaves.O compilador não sabe o que você quer ou precisa, ele apenas vê uma construção de linguagem que está quase correta e avisa o que está faltando para que ela esteja totalmente correta.
fonte
Para alguém que está interessado em tal mapa porque deseja reduzir a área de cobertura do autoboxing em Java de wrappers sobre tipos primitivos, eu recomendaria usar coleções Eclipse . Trove não é mais suportado , e acredito que seja uma biblioteca pouco confiável (embora seja bastante popular de qualquer maneira) e não poderia ser comparada com as coleções do Eclipse .
Neste exemplo acima, IntObjectHashMap .
Como você precisa de mapeamento int-> objeto , também considere o uso de
YourObjectType[]
array ouList<YourObjectType>
e valores de acesso por índice, já que map é, por natureza, um array associativo com tipo int como índice.fonte