ArrayList ou Vector?

14 respostas
EuclidesFilizola

Boa tarde pessoal,

eu sei que Vector é mais antiga… e que arraylist é mais seguro e talz… talz…

porém eu estou me deparando com um problema, que por incrivel que pareça eu só consigo resolver com vector. Gostaria que vocês me ajudassem.

é o seguinte, eu crio um ArrayList<Object> e dentro dele, eu recebo um resultList de uma NativeQuery, conforme método abaixo:

public List<Object> listaDeBensPorNumNotaFiscal(int codNotaFiscal){
		
		List<Object> lista = new ArrayList<Object>();
		EntityManager manager = factory.createEntityManager();
	
		try{
		
		manager.getTransaction().begin();
		
		final Query query = manager
		.createNativeQuery("SELECT * , D.vl_Deprec  FROM financeiro.TBSIFN_NOTAFISCALBENS NFB," +
				" financeiro.TBSIFN_DEPRECIACAO D WHERE cd_NotaFiscal = " + codNotaFiscal + 
				"AND D.cd_Deprec = NFB.cd_Deprec ORDER BY cd_Inclusao");
		
lista =  query.getResultList();
		
		manager.getTransaction().commit();
		}catch (Exception e) {
			// TODO: handle exception
		}finally{
			if (manager != null) {
				manager.close();
			}
		}
		
		return lista;
		
	}

O problema de ela continuar como ArrayList de Object é que, quando eu tento retomar o valor que possui, da erro.
Por exemplo, o valor da posição 2, é do tipo Integer.
Quando eu tento fazer isso:

Integer teste = (Integer) lista.get(2);

ele não funciona, da erro de conversão e diz que o objeto do tipo Object não pode ser convertido para Integer.

E então eu pego e faço o seguinte.

percorro um vector e jogo o arraylist todo no vector, dae o resultado vem do jeito que eu quiser.

por exemplo:

if (this.notaFiscal.getCodNotaFiscal() != null) {
		
		for (Object notaFiscalBens : nfBensDao.listaDeBensPorNumNotaFiscal(this.notaFiscal.getCodNotaFiscal()) )
		{
			listaBens.add((Object[])notaFiscalBens);
			
		
		}

Ou seja, eu estou pegando o ArrayList<Object> e passando para listaBens que é do tipo Vector.

Alguém teria alguma solução para mim melhorar isso ?

14 Respostas

Vmaia

Opa!

Por acaso o resultado do query.list() é uma array de array?

peczenyj

Vector ta praticamente deprecated…

lina

Oi,

Só a utilização da List que está de forma errada.

Olha a diferença:

ArrayList<Object>
list = new ArrayList<Object>();
list.add(1);
		
Integer
teste = (Integer)list.get(0);
		
System.out.println(teste);

Porque o exemplo acima não dá erro? :wink:

Tchauzin!

EuclidesFilizola

aqui está o result.

List<Object> lista = new ArrayList<Object>();
		EntityManager manager = factory.createEntityManager();
	
		try{
		
		manager.getTransaction().begin();
		
		final Query query = manager
		.createNativeQuery("SELECT * , D.vl_Deprec  FROM financeiro.TBSIFN_NOTAFISCALBENS NFB," +
				" financeiro.TBSIFN_DEPRECIACAO D WHERE cd_NotaFiscal = " + codNotaFiscal + 
				"AND D.cd_Deprec = NFB.cd_Deprec ORDER BY cd_Inclusao");
		
lista =  query.getResultList();

é um ArrayList de Object.

EuclidesFilizola
lina:
Oi,

Só a utilização da List que está de forma errada.

Olha a diferença:

ArrayList<Object>
list = new ArrayList<Object>();
list.add(1);
		
Integer
teste = (Integer)list.get(0);
		
System.out.println(teste);

Porque o exemplo acima não dá erro? :wink:

Tchauzin!

A diferença é que vc está adicionando um inteiro, e não um objeto como eu estou fazendo. No seu caso, nem precisaria do Cast Integer, bastava o get(0) que ele iria trazer.

lina
EuclidesFilizola:
lina:
Oi,

Só a utilização da List que está de forma errada.

Olha a diferença:

ArrayList<Object>
list = new ArrayList<Object>();
list.add(1);
		
Integer
teste = (Integer)list.get(0);
		
System.out.println(teste);

Porque o exemplo acima não dá erro? :wink:

Tchauzin!

A diferença é que vc está adicionando um inteiro, e não um objeto como eu estou fazendo. No seu caso, nem precisaria do Cast Integer, bastava o get(0) que ele iria trazer.

Oi,

Não senhor.. como defini que o meu ArrayList só aceitaria o tipo , o mesmo necessita de cast.

Provavelmente no seu caso, o get(2) não retorna um valor Integer.

Tchauzin!

Vmaia

Olha só … é provavel que teu query.list() esteja devolvendo um Array[][] .

  • Array[0][0] = coluna1A , coluna1B, coluna1C, …
  • Array[0][0] = coluna2A , coluna2B, coluna2C, …

ou seja… não tem como fazer o cast de Integer se vc somente fizer array[0].

Acredito que seja isso.

EuclidesFilizola
lina:
EuclidesFilizola:
lina:
Oi,

Só a utilização da List que está de forma errada.

Olha a diferença:

ArrayList<Object>
list = new ArrayList<Object>();
list.add(1);
		
Integer
teste = (Integer)list.get(0);
		
System.out.println(teste);

Porque o exemplo acima não dá erro? :wink:

Tchauzin!

A diferença é que vc está adicionando um inteiro, e não um objeto como eu estou fazendo. No seu caso, nem precisaria do Cast Integer, bastava o get(0) que ele iria trazer.

Oi,

Não senhor.. como defini que o meu ArrayList só aceitaria o tipo , o mesmo necessita de cast.

Provavelmente no seu caso, o get(2) não retorna um valor Integer.

Tchauzin!

Foi mal, eu me precipitei. Eu quis dizer que há uma diferença. Nesse caso ae, você já seta um tipo primitivo "1". No meu caso, é uma lista que dentro dela há vários tipos, há Integer, Date, String .... etc ....

o meu problema é que, se eu tentar converter a lista.get(x) para o tipo correto dela, não funciona !

só para ter uma ideia, se eu fizer um System.Out.Println(lista.get(2).class) e pegar o tipo dessa classe e tentar fazer um cast, ele não vai funcionar. !

vocês estão me entendendo. ?

vocês estão entendendo. ?

Vmaia
public static void main(String[] args) {

		List<Object> lista = new ArrayList<Object>();
		EntityManager manager = factory.createEntityManager();

		try {

			manager.getTransaction().begin();

			final Query query = manager
					.createNativeQuery("SELECT * , D.vl_Deprec  FROM financeiro.TBSIFN_NOTAFISCALBENS NFB,"
							+ " financeiro.TBSIFN_DEPRECIACAO D WHERE cd_NotaFiscal = "
							+ codNotaFiscal
							+ "AND D.cd_Deprec = NFB.cd_Deprec ORDER BY cd_Inclusao");

			/* este metodo getResultList() está, provavelemente, te devolvendo um array, 
			 * já que o "select *, D.vl_Deprec", apontam pelo menos 2 campos. Se tiver 
			 * mais de uma linha de rsposta logo terá uma array de array.
			 * 
			 *  lista[o] = {coluna0A, coluna0B}
			 *  lista[1] = {coluna1A, coluna1B}
			 *  lista[2] = {coluna2A, coluna2B}
			 *  assim por diante.......
			 *  
			 * */ 
			lista = query.getResultList();

			manager.getTransaction().commit();
		} catch (Exception e) {
			// TODO: handle exception  TEM ALGUM PRINT AQUI ? ahsuhaushausa, é cheio disso em alguns códigos legados que eu pego
		} finally {
			if (manager != null) {
				manager.close();
			}
		}
		
		
		/* caso esteja retornando um array de array mesmo a linha abaixo irá disparar um CastClassException*/
		Integer teste = (Integer) lista.get(2); 
		
		/*Deveria ser assim, mais ou menos*/
		List<Object> listaSimples = (List<Object>) lista.get(2);
		
		Integer teste1 = (Integer)listaSimples.get(indiceDeOndeTeraUmInteger);

	}

Era mais ou menos isso que eu estava querendo dizer...... só não posso afirmar pois não sei resultado do SQL. :D

EuclidesFilizola

Sim…

e entao tem alguma ideia pra me ajudar ? O problema é que meu select traz mais de 1 entidade, por isso que eu faço um array de <Object>. e utilizo uma nativeQuery.

… alguem tem ideia pra me ajudar ?

sergiotaborda

EuclidesFilizola:
Sim…

e entao tem alguma ideia pra me ajudar ? O problema é que meu select traz mais de 1 entidade, por isso que eu faço um array de <Object>. e utilizo uma nativeQuery.

… alguem tem ideia pra me ajudar ?

O problema é que vc confundiu todo o mundo quando falou em Vector, quanto na realidade vc não está usando Vector e sim array. (Em java, não se usa a palavra “vector” para se referir a arrays porque Vector é uma classe java)

listaBens.add((Object[])notaFiscalBens);

O problema é que o seu objecto é um array e vc quer colocá-lo num List.

O que vc pode fazer muito mais facilmente assim

listaBens =  Arrays.asList(notaFiscalBens);

quando vc executa sua query vc revebe um List de array de Object ( Ou seja List<Object[]> )

Para trabalhar com isso e recuperar o campo 3 da linha 2 vc faz

Integer teste = (Integer) lista.get(2)[3];  // repare que um é () e o outro é []

contudo, o seu problema é no uso do hibernate. Vc deve declarar um objeto de relatorio de forma que o hibernate popule esse objeto. ai vc terá uma lista de objetos , que é muito mais simples de tratar que uma lista de array.

rogelgarcia

Só uma observação entre Vector e ArrayList…

ArrayList não é uma versão mais nova e segura de Vector…

A diferença entre Vector e ArrayList é que Vector é synchronized e ArrayList não é synchronized…

Dependendo da situação você precisará usar Vector (quando tiver várias threads usando o mesmo objeto por exemplo) (que nao é o caso)

EuclidesFilizola

rogelgarcia:
Só uma observação entre Vector e ArrayList…

ArrayList não é uma versão mais nova e segura de Vector…

A diferença entre Vector e ArrayList é que Vector é synchronized e ArrayList não é synchronized…

Dependendo da situação você precisará usar Vector (quando tiver várias threads usando o mesmo objeto por exemplo) (que nao é o caso)

Bom dia garcia,

então você teria alguma idéia para me ajudar ? algo para me dar uma força ?

rogelgarcia

EuclidesFilizola:
rogelgarcia:
Só uma observação entre Vector e ArrayList…

ArrayList não é uma versão mais nova e segura de Vector…

A diferença entre Vector e ArrayList é que Vector é synchronized e ArrayList não é synchronized…

Dependendo da situação você precisará usar Vector (quando tiver várias threads usando o mesmo objeto por exemplo) (que nao é o caso)

Bom dia garcia,

então você teria alguma idéia para me ajudar ? algo para me dar uma força ?

Não li tudo que o pessoal falou … mas na sua pergunta:

Integer teste = (Integer) lista.get(2);

O valor da posição 2 não é integer…

Acho que deve ser Object[]…

Então voce teria que fazer (Integer) ((Object[])lista.get(1))[2]…

Lembre-se que o resultado de uma query é uma lista de listas…

1 -> [campo1, campo2, campo3, campo4]
2 -> [campo1, campo2, campo3, campo4]
3 -> [campo1, campo2, campo3, campo4]
4 -> [campo1, campo2, campo3, campo4]
5 -> [campo1, campo2, campo3, campo4]

Se vc quiser pegar o campo em negrito por exemplo… o código seria:

Object[] linha2 = (Object[])lista.get(2); //pegar o segundo resultado Object o = linha2[2];// pega o tericeiro item.. lembre-se que o array começa em zero.. então o terceiro item é com indice 2

Depois vc faz o cast do objeto para o tipo correto
Aprenda a usar o debug… vai ajudar…

Criado 9 de junho de 2010
Ultima resposta 11 de jun. de 2010
Respostas 14
Participantes 6