HashMap ponto três, sem iteração interna
-
06-07-2019 - |
Pergunta
Qual é a melhor maneira de implementar um HashMap três produto? Por exemplo, eu gostaria de usar uma chave de Cordas regular, mas tem que mapear a dois objetos diferentes. A idéia é como ter uma lista de listas, exceto que o primeiro item é uma chave.
Eu estou tentando evitar a iteração através da lista (de modo que o comportamento é como uma hashmap). Você concorda a única maneira é construir uma nova classe? Parece um objeto "HashMap3" (com métodos de get1 (key) & get2 (chave)) seria útil. Não tenho a certeza de como configurar isso mesmo.
Como posso criar a coleção?
Solução
Se a chave sempre será mapeado para exatamente dois objetos, em seguida, a maneira mais fácil de fazer isso é fazer uma classe Pair
que existe apenas para manter os dois objetos. Então você usa o seu String como a chave ea instância Pair
como o valor. No entanto, se a chave pode mapear para arbitrariamente muitos objetos, em seguida, IMO a melhor maneira de fazer isso é ter o valor armazenado no Map
ser um Collection
de algum tipo.
Outras dicas
olhada no Google-coleções Multimap
Uma coleção semelhante a um mapa, mas que pode associar vários valores com uma única chave. Se você chamar put (K, V) duas vezes, com a mesma chave, mas valores diferentes, multimap contém mapeamentos da chave para ambos valores.
A hash hashes talvez?
Eu concordo com Eddie, e só tinha um problema semelhante apenas com muitos valores, e não dois. Eu queria um Java ConcurrentHashMap a realização de uma XML esconderijo de documentos que estão sendo buscados de um serviço web, e eu precisava para gravar várias peças de informação ao lado do XML para apoiar as estratégias de despejo do Cache (por exemplo, Least Recently Used, Least Frequently Used).
A solução foi apenas para definir uma classe de objeto que contém esses itens. Eu usei um dentro classe aninhada privada da minha classe Cache, algo como isto:
private static class CacheEntry
{
private String uri; // Key
private String fetched_xml; // The XML document (main value)
private long put_time;
private long expires_time;
private long size;
private long hits;
private long last_used_time;
}
O ConcurrentHashMap foi digitado na URI e ficou assim:
private final Map<String, CacheEntry> cache;
[...]
cache = new ConcurrentHashMap<String, CacheEntry>(100, 0.75f, 3);
Este código adiciona um novo documento XML para o cache:
CacheEntry value = new CacheEntry();
value.fetched_xml(fetched_xml);
value.uri = uri;
value.put_time = System.currentTimeMillis();
value.expires_time = representation.getExpirationDate().getTime();
value.size = bytes_fetched;
value.hits = 0;
value.last_used_time = 0;
cache.put(uri, value);
Editar: Se você precisa mapear a chave para um List de n objetos em Java, você pode colocar os objetos em um java.util.collections.ArrayList e usar o ArrayList como o valor Mapa. ??