Estrutura de armazenamento

5 respostas
S

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?

[]'s

5 Respostas

Alexandre_Saudate

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

teria algum exemplo prático?

M

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.

Criado 24 de fevereiro de 2010
Ultima resposta 24 de fev. de 2010
Respostas 5
Participantes 5