Problema com Conversão

16 respostas
D

Tenho esse método no meu programa:

public int comparison(Vector<Integer> vector, ArrayList<Integer> y, ArrayList<Integer> x) {
        int totalx = 0, totaly = 0;
           
        for (int i = 0; i < vector.size(); i++) {
            totaly += vector.get(i) * y.get(i);
            totalx += vector.get(i) * y.get(i);
        }
        return (totalx - totaly);
    }
Antes de mais nada, já fiz o teste com vector.size() e vector.get() e estão funcionando certinho. Mas está dando erro na linha 5:
totaly += vector.get(i) * y.get(i);

Retornando a seguinte mensagem na execução:

"Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer"

Por que está dando isso se nem com String eu estou trabalhando?

Abraço!

16 Respostas

diegosantiviago

Coloca tudo aê!

maschiojv

Provavelmente vector ou y não são tipados em algum lugar (passam por um método que recebe Vector sem tipagem por exemplo), onde uma string pode ser colocada neles e quando você faz o get() o java tenta fazer um cast, que não dá certo.

O
É como o maschiojv. Outra coisa, se eu entendi seu código, acho que a linha 6 devia ser assim (repare no x.get...):
totalx += vector.get(i) * x.get(i);
Não é?

Por fim, seu método pode ser escrito assim também que dá o mesmo resultado:

public int comparison2(Vector<Integer> vector, ArrayList<Integer> y, ArrayList<Integer> x) {
   int comparison = 0;

   for (int i = 0; i < vector.size(); i++) {
      comparison += vector.get(i) * (x.get(i) - y.get(i));
   }
   return comparison;
}
Aproveitando o código, uma pergunta pra galera: Eu não gosto de depender do recurso boxing/unboxing. Tem algum recomendação que concorde com meu pensamento ou é só preciosismo meu mesmo?
D

A primeira correção do ozix está correta.
Não posso fazer da segunda forma, porque não sei se dar o mesmo resultado.

Mas, tirando isso, vasculhei o código todo e a tipagem tá normal, sem adição de String nenhuma.

diegosantiviago, o código é grande =/

O erro continua: “Exception in thread “AWT-EventQueue-0” java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer”

Alguém tem idéia do que seja?

Obrigado aos que já tentaram ajudar!

Abraços!

D

Alguém? =)

diegosantiviago

É complicado, porque esse erro é de execução, e não sei o que tem dentro desta lista :confused:

O

brother, a minha alternativa está matematicamente correta.

Quanto ao erro, é devido ao problema já falado pelo maschiojv, mas já que você não quer colocar o resto do código, adicionar essas 3 linhas a seu método e você vai ver qual coleção está entrando com itens de String:
public int comparison(Vector<Integer> vector, ArrayList<Integer> y, ArrayList<Integer> x) {
      System.out.println(((Vector)vector).get(0).getClass());
      System.out.println(((ArrayList)y).get(0).getClass());
      System.out.println(((ArrayList)x).get(0).getClass());
      
      int totalx = 0, totaly = 0;
      
      for (int i = 0; i < vector.size(); i++) {
         totaly += vector.get(i) * y.get(i);
         totalx += vector.get(i) * x.get(i);
      }
      return (totalx - totaly);
   }
D

Vlw ozix!

Descobri dessa forma que é o Vector que contém String.
Agora, como converto?

Mesmo sem saber, antes, tentei converter sem sucesso.

Tentei cast, tentei .intValue() etc…

Obrigado!

O

Aff, ok, lets POG. Use o Integer.parseInt()

D

Esqueci de falar que tinha tentado esse método também e não foi =/

Marcelo_FS

Assim?

public int comparison(Vector<Object> vector, ArrayList<Object> y, ArrayList<Object> x) {
      
      int totalx = 0, totaly = 0;
      
      for (int i = 0; i < vector.size(); i++) {
         totaly += Integer.valueOf(vector.get(i)) * Integer.valueOf(y.get(i));
         totalx += Integer.valueOf(vector.get(i)) * Integer.valueOf(x.get(i));
      }
      return (totalx - totaly);
   }

Mas é um POG danado… melhor seria você tipar corretamente essas coleções em todo o seu código.

D

Tb não foi assim =/

Marcelo_FS

Como não? :? Que que deu?

D

Mesmo erro acima. Mudou nada =/

Marcelo_FS

Não dá o mesmo erro… ele não compila pq eu esqueci que o #valueOf aceita int e String, não Object :wink:

public int comparison(final Vector<Object> vector, final ArrayList<Integer> y,
			final ArrayList<Integer> x) {

		int totalx = 0, totaly = 0;

		for (int i = 0; i < vector.size(); i++) {
			final Object valorVector = vector.get(i);

			if (valorVector instanceof Integer) {
				totaly += ((Integer) vector.get(i)) * y.get(i);
				totalx += ((Integer) vector.get(i)) * x.get(i);
			}
			else
				if (valorVector instanceof String) {
					totaly += Integer.valueOf((String) vector.get(i)) * y.get(i);
					totalx += Integer.valueOf((String) vector.get(i)) * x.get(i);
				}
		}
		return (totalx - totaly);
	}
D

Vlw Marcelo!

Aparentemente solucionou o problema!

Muito obrigado :wink:

Criado 12 de fevereiro de 2009
Ultima resposta 13 de fev. de 2009
Respostas 16
Participantes 5