Ajuda com lógica e interseção

Faço select na base de dados das colunas Codigo e Data2, o retorno será uma lista.

Devo verificar se os valores desses campos existem na arquivo texto linha por linha se todas as informações que estão na lista do banco não existirem no arquivo texto devo lançar uma exception.
É uma interseção todos os dados da listaBanco devem existir na listaArquivo.

Pensei em algo do tipo:

//informações que estiverem nas duas lista insiro no banco
Collection listaPersistir = dao.getLista();
Collection listaBanco = new ArrayList();
Collection listaArquivoTexto= reader.getLista();
	for (Iterator iterBanco = listaBanco.iterator(); iterBanco.hasNext();) {
		PrecoMercadoMoedaVO moedaVO = (PrecoMercadoMoedaVO)iterBanco.next();
			a : for (Iterator iterTexto = listaArquivoTexto.iterator(); iterTexto.hasNext();) {
				PrecoMercadoMoedaVO moedaVO2 = (PrecoMercadoMoedaVO)iterTexto.next();		
				if((moedaVO.getCodMoeda() == moedaVO2.getCodMoeda()) && (moedaVO.getDatCotacao().equals(moedaVO2.getDatCotacao()))){
					listaPersistir.add(moedaVO2);
					break a; 
			}
			//em que momento lanço a exception se os dados da listaBanco não existir na listaArquivoTexto ?
		}
	}

Arquivo texto

Data | Codigo | Data2 | Valor

Base de dados

Data | Codigo | Data2 | Valor

comparação entre Codigo e Data2.

Pessoal essa é a melhor forma?

Existe alguma classe que pode me auxiliar?

Agradeço qualquer sugestão…

Se você olhar o fonte de “retainAll” (união) e “removeAll” (intersecção) nos fontes de java.util.Set, java.util.SortedSet ou java.util.HashSet (não sei em qual deles achar - é questão de dar uma olhada) vai ver que não é assim tão diferente.

thingol dessa forma funciona…

Set letras1 = new HashSet (Arrays.asList (new String [] {
		"A", "B", "F"})); 

Set letras2 = new HashSet (Arrays.asList (new String [] {
		"A", "D", "B", "C"})); 

System.out.println(letras2.retainAll (letras1)); 

Mais o problema é que eu tenho objetos Beans dentro das listas.
ou seja:

Set letras1 = new HashSet (); 
Bean bean = new Bean();
letras1.add(bean)

Set letras2 = new HashSet (); 
Bean bean2 = new Bean();
bean.set();
letras1.add(bean2)
System.out.println(letras2.retainAll (letras1)); 

E é por isso que eu não insisti muito para você mudar sua implementação. Se as duas listas forem suficientemente pequenas (menos de 10 elementos cada), fazer isso que você fez não é tão mais lento que usar Sets e implementar uma versão de “equals” e “hashCode” apropriada.
(Eu sou mais preguiçoso ainda, e se eu é que fosse fazer isso, usaria SortedSets (como TreeSet) e uma classe que implementa Comparator, para poder comparar dois Beans. )

[quote=thingol]E é por isso que eu não insisti muito para você mudar sua implementação. Se as duas listas forem suficientemente pequenas (menos de 10 elementos cada), fazer isso que você fez não é tão mais lento que usar Sets e implementar uma versão de “equals” e “hashCode” apropriada.
(Eu sou mais preguiçoso ainda, e se eu é que fosse fazer isso, usaria SortedSets (como TreeSet) e uma classe que implementa Comparator, para poder comparar dois Beans. ) [/quote]

thingol vc implementaria o método compare da interface Comparator?
A lógica do seu método seria bem parecido com o que eu estou fazendo…certo ?

Vamos lá.

class PrecoMercadoMoedaVO {
public int getCodMoeda() {...}
public Date getDatCotacao() {...}
}
/* Você pode ter vários comparators, por isso é que não fiz 
 * PrecoMercadoMoedaVO implementar Comparable */
class ComparatorPrecoMercadoMoeda1 implements Comparator<PrecoMercadoMoedaVO> {
    public int compare (PrecoMercadoMoedaVO p1, PrecoMercadoMoedaVO p2) {
    // ordene pelo código e a seguir pela cotação
    // isto fica como exercício. Só você lembrar-se que:
    // se o código e a data da cotação baterem, retorne 0
    // se o código bater, considere a data (para facilitar use o próprio "compareTo")
    // se o código não bater, considere o código (para facilitar, subtraia um do outro, como: return p1.getCodMoeda() - p2.getCodMoeda());
 }
}
...
SortedSet<PrecoMercadoMoedaVO> s1 = new TreeSet<PrecoMercadoMoedaVO> (new ComparatorPrecoMercadoMoeda1());

SortedSet<PrecoMercadoMoedaVO> s2 = new TreeSet<PrecoMercadoMoedaVO> (new ComparatorPrecoMercadoMoeda1());

... acho que você deve ter entendido o que fazer.

thingol, ficou claro.
:smiley: :smiley: :smiley:

Valeu…

Só me resta saber agora qual solução é mais rápida…
vou testar…

thingol

[quote] // se o código bater, considere a data (para facilitar use o próprio “compareTo”)
// se o código não bater, considere o código (para facilitar, subtraia um do outro, como: return p1.getCodMoeda() - p2.getCodMoeda());
[/quote]

na verdade eu tenho que validar os dois. Forma se não me engano estou verificando um por um, e preciso verificar todos da listaBanco com os da listaTxt. E caso todas as informações da listaBanco não exstirem no listaTxt tenho que lançar um erro.