Vector, hashTables, Collections

Olá Pessoal,

Tenho uma aplicação que possui um campo (matrícula do funcionário) em uma tabela que aponta para um arquivo de fotografia (ex. 238876.jpg). Vou percorrer um resultset com todas as matrículas e ver que funcionários não possuem fotos (posteriormente vice-versa, ou seja, que fotos não possuem funcionários).

Qual a melhor opção para guardar os nomes dos arquivos e depois buscá-los indexados pelo próprio nome?

Qualquer dica será bem vinda!

Obrigado a todos

Voce vai pegar todos os dados e manipular via codigo Java? se for isso, pq vc simplesmente nao faz isso diretamente na query? Tipo, uma query para pegar todos sem foto e outra para fotos sem funcionario. Algo como

SELECT campo1, campo2 FROM tabela WHERE nome_funcionario <> '' AND foto = ''

Assim vc nao precisa ficar iterando pelo ResultSet.

Rafael

Voce quer uma colecao que seja ordenada? Os valores sao String, certo? Da pra usar uma implementacao de List (ArrayList, p.ex.), e depois fazer um Collections.sort(). Ou entao usar uma colecao que seja ordenada por padrao (TreeSet, TreeMap, p.ex.). Ou ainda fazer um ORDER BY na consulta e jogar numa List o conteudo ja ordenado. :smiley:

Marcio Kuchma

Desde já obrigado pelo retorno pessoal.

Rafael, provavelmente não me expliquei direito. Eu não tenho nenhum campo no banco indicando se existe foto ou não. O que eu preciso fazer é:
Para cada matricula recuperada via recordset (que pode até ser ordenado) verificar em um diretório se o arquivo [matricula].jpg existe.

Márcio, suas dicas são legais mas como exatamente eu faço a pesquisa com o nome do arquivo, ou seja, [matricula.jpg] no treeset?

Além de tudo isto, imagino que uma possibilidade seria utilizar a classe File e testar a existência com o exists() mas acredito Vocês tenham uma solução mais eficaz e elegante.

Novamente muito obrigado.

Abraços

Acho que agora entendi… voce tem uma lista de matriculas e um diretorios com arquivos JPG (p.ex)… entao voce quer ver que matriculas tem JPG correspondente - certo?

Pesquise as matriculas, jogue num Set. Leia a lista de arquivos do diretorio de imagens e jogue em outro Set. Entao use operacoes como removeAll() e retainAll() para obter elementos que estao em um conjunto, mas nao no outro, e vice-versa. :smiley:

Marcio Kuchma

Obrigado Márcio

Estou usando 2 ArrayList para esta comparação mas acredito que a sua sugestão de Collection, por apresentar os métodos que Você citou, seja mais adequada.
Sei que não é bom pedir para incluir pedaços de código para não nos tornarmos preguiçosos, mas neste caso a Collection é realmente novidade para mim.
Existe a possibilidade de apresentar algum código da Collection por mais simples que seja?

Desde já obrigado

Abraços

Collection c = new ArrayList();

De uma olhada no capitulo de collections na apostila 11 do site www.caelum.com.br
att

Valeu pela ajuda Guilherme

Abraços

Nao testei…

Set nameSet = new HashSet();
Set imageSet = new HashSet();
String extension = ".jpg";

// obtenha as matriculas reais da fonte de dados
nameSet.add("123" + extension);
nameSet.add("456" + extension);
nameSet.add("789" + extension);

// obtenha os nomes dos arquivos reais do filesystem
fileSet.add("123.jpg");
fileSet.add("456.jpg");
fileSet.add("a.jpg");

// nesse ponto nameSet.retainAll(fileSet) fara com que fique em 
// nameSet apenas as matriculas que tem arquivo associado e vice-versa

Mais info:

http://java.sun.com/j2se/1.4.2/docs/api/java/util/Set.html
http://java.sun.com/j2se/1.4.2/docs/api/java/util/HashSet.html

Nao va ficar mal-acostumado. :mrgreen:

Marcio Kuchma

Marcio,

Não testei, mas vou testar. Só pela ajuda já me valeu muito.

Juro que não vou ficar mal-acostumado.

Obrigado de novo…

[quote=kuchma]Nao testei…

Set nameSet = new HashSet();
Set imageSet = new HashSet();
String extension = ".jpg";

// obtenha as matriculas reais da fonte de dados
nameSet.add("123" + extension);
nameSet.add("456" + extension);
nameSet.add("789" + extension);

// obtenha os nomes dos arquivos reais do filesystem
fileSet.add("123.jpg");
fileSet.add("456.jpg");
fileSet.add("a.jpg");

// nesse ponto nameSet.retainAll(fileSet) fara com que fique em 
// nameSet apenas as matriculas que tem arquivo associado e vice-versa

Muito cuidado com polimorfismo quando for usar o metodo retainAll
No caso voce esta se referenciando a um set e deve saber que nem todo set implementa tal metodo (horrendo).

Portanto nesses casos eh melhor pedir a referencia a algum set que implementa tal metodo ou construir voce mesmo a partir de uma collection tal set:

public Set retornaUniaoDeConjuntos(Collection c1, Collection c2) {
return new HashSet(c1).retainAll(new HashSet(c2));
}

[/quote]