Olá… estou precisando de algumas dicas para armazenamento de dados em uma estrutura local. Tenho uma classe que possui um metodo que recebe requisições de trabalho e precisa armazenar localmente em uma estrutura tipo (chave, valor). Já tentei utilizar linkedhashmap mas esse não aceita chaves duplicadas.
O que pode ocorrer é que irei receber chaves duplicadas nessas requisições. Alguem teria algumas dicas de como posso fazer esse armazenamento?
Bom… aí, vc tem um problema sério, pq eh óbvio que nenhum mapa nesse mundo vai permitir chaves duplicadas (nem deveria). O ideal pra vc seria, então, criar uma estrutura de dados que armazene a chave-valor e armazene esses dados numa lista.
[]´s
bigjoe
nessas situações, costumo fazer um Map<Chave, ArrayList> ou algo equivalente.
S
spiderman
teria algum exemplo prático?
M
marcobiscaro2112
Estou fazendo um programa que detecta arquivos duplicados (em breve será liberado aqui no fórum).
Nele eu preciso armazenar todos os arquivos a partir do hash MD5 de cada um deles. E pode haver mais de um arquivo com o mesmo hash (justamente nesse caso são duplicatas).
Para armazenar essas informações estou usando um mapa de String -> Set de arquivos (Map<String, Set >).
Vou colocar aqui um trecho da classe pertinente a isso:
private Map<String, Set<File>> duplicateFiles;
// mais código aqui....
private void findDuplicates() {
int count = 0;
for (Set<File> files : possibleDuplicates) {
Map<String, Set<File>> tempMap = new HashMap<String, Set<File>>();
for (File f : files) {
put(tempMap, FileUtils.generateHash(f), f);
count++;
setProgress((int) (count * 49 / possibleDuplicateCount + 50));
}
removeTrash(tempMap);
duplicateFiles.putAll(tempMap);
}
}
private static <K, T> void put(Map<K, Set<T>> map, K key, T value) {
Set<T> tempSet;
if (map.containsKey(key)) {
tempSet = map.get(key);
} else {
tempSet = new HashSet<T>();
map.put(key, tempSet);
}
tempSet.add(value);
}
private static <K> void removeTrash(Map<K, Set<File>> map) {
Iterator<K> i = map.keySet().iterator();
while (i.hasNext()) {
K key = i.next();
if (map.get(key).size() < 2) {
i.remove();
}
}
}
Tchello
Se não me engano na API google Collections tem algo do tipo que possa lhe atender.
Sugiro uma boa pesquisa nisso.