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?
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.
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.
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.
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.
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?
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
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));
}