Vector ! socorro!

:?: :oops:

Não estou conseguindo ler os dados de Vector.

Criei uma classe que faz uma pesquisa na tabela e grava um vector o resultado. O vector contém todos os campos da tabela, ou seja tenho campo tipo String, tipo int e tipo long. Em um total de 14 campos.

Em outra classe (classe onde está a lógica de negócio), recupero o vector. Até aí tudo bem, inclusive consigo pegar o size() do vector.

Só não sei como ler os dados deste Vector.

Alguém me ajuda???

Denise:

Aconselharia vc a dar uma olhada na API do java, pois acredito nao ser muito dificil o que vc quer fazer ja que fez a parte dificil…tem um metodo da classe Vector, o elementAt(index i), onde vc passa o indice de onde vc quer ler dentro do vetor…nao sei se irá ajudar, mas ve se ele funciona, sei que eh estatico, mas dando um for no indice do vetor depois usando este metodo pode ser que funcione, se caso não funcionar, de uma pesquisada na API.

Sem mais,

você deveria criar uma classe que tivesse todos esses campos como atributos (ex:classe tab), depois vc iria colocando os objetos desta classe no se vector
para ler vc faz

tab t=(tab)vct.elementAt(indice);

é necessário fazer o cast para a classe pois o vector guarda tudo como object

qualquer dúvida estamos aí…

[quote=“fabiolima2003”]você deveria criar uma classe que tivesse todos esses campos como atributos (ex:classe tab), depois vc iria colocando os objetos desta classe no se vector
para ler vc faz

tab t=(tab)vct.elementAt(indice);

é necessário fazer o cast para a classe pois o vector guarda tudo como object

qualquer dúvida estamos aí…[/quote]

Desculpa … mas sou iniciante… como faz um cast e como coloco os atributos da classe no vetor??

Tudo depende de como voce gravou os dados no Vector ( que por sinal era melhor voce usar ArrayList no lugar, por questoes de desempenho ).
Ha varias maneiras de colocar os dados, como por exemplo colocar em cada posicao um objeto da classe com os dados ja, colocar valor por valor em um Vetor que depois sera adicionado a um outro vector etc…
Levando em conta um exemplo mais simples, onde cada coluna retornada eh colocada em uma posicao do vector, voce faria algo mais ou menos assim:

...
while (rs.next()) {
    meuVector.add(rs.getString("campo 1"));
    meuVector.add(rs.getString("campo 2"));
    meuVector.add(rs.getInt("campo 4"));3
}
...

Agora, para recuperar, a coisa fica complicada, ja que voce tem, em um mesmo vector, varios tipos diferentes de objetos. Uma saida eh fazer

...
int len = meuVector.size();
for (int i = 0; i < len; i++) {
    // Verifica o tipo de objeto contido na posicao atual
    if (meuVector.elementAt(i) instanceof String)
        System.out.println("Eh uma string: "+ meuVector.elementAt(i));
    else if if (meuVector.elementAt(i) instanceof Integer)
        System.out.println("Eh um integer: "+ meuVector.elementAt(i));

    // e assim por diante

isso logicamente da um enorme trabalho. Se para voce nao eh necessario saber o tipo de dado contido ( ou seja, caso queria apenas jogar na tela, e nao atribuir a outras variaveis ), pode simpelsmente passar item por item e usar elementAt() para recuparar o valor, sem se importar com o tipo.

A solucao mostrada ate aqui eh ineficaz, dificil de manter e chata de programar. Como o outro colega comentou, o melhor eh voce adicionar nais posicoes do Vector os objetos da classe e entao usar os metodos dela para recuperar os dados. Eis um exemplo de codigo:

// Classe para guardar os dados recuperados com SQL
class MeuDados
{
     private String nome;
     private String email;
     private String idade;

     public MeuDados(String nome, String email, int idade)
     {
          this.nome = nome;
          this.email = email;
          this.idade = idade;
     }

     // Metodos para recuperar os valores
     public String getNome()
     {
          return nome;
     }

     public String getEmail()
     {
          return email;
     }

     public int getIdade()
     {
          return idade;
     }
     
}

Essa classe sera usada para guardar os dados do sql. Digamos entao que o teu codigo para mexer com o banco de dados eh algo mais ou menos assim:

// ...
// select nome, email, idade fom blablabla
while (rs.next()) {
    // Pega os dados e coloca na nossa classe e joga dentro do Vector
    meuVector.add(new MeusDados(rs.getString("nome"), rs.getString("email"), rs.getInt("idade")));
}
...

Note que adicionamos ao Vector objetos do tipo MeusDados, o que facilita muito a recuperacao correta dos mesmos. Veja:

// tua classe onde deseja mostrar os dados
...
int len = meuVector.size();
for (int i = 0; i < len; i++) {
    MeusDados md = (MeusDados)meuVector.elementAt(i);

    // Escreve na tela os dados
    System.out.println("Nome: "+ md.getNome());
    System.out.println("Email: "+ md.getEmail());
    System.out.println("Idade: "+ md.getIdade());
}
....

E eh isso basicamente. Note que muito do que falei eh questao de assimilar conceitos e pensar um pouco no projeto, mas com o tempo voce vai adquiriando experiencia e entendendo mais facilmente isso.
Eu nao tentei compilar o codigo mostrado aqui, portanto nao o leve ao pe da letra :smiley:

Abraco, e conte sempre com o GUJ.

Rafael

Só um detalhezinho…
Foi escrito “ou seja tenho campo tipo String, tipo int e tipo long”, mas eu pensava que Vector só aceitasse objetos… ele aceita tipos primitivos também?
E, se eu estiver certa, é necessário fazer uns ajustezinhos no código do Rafael também.

eh, so Object. E como eu disse, NAO levar ao pe-da-letra o codigo, pois eu nao testei e nao programei tendo em vista performance e outras coisas, poise senao ficaria um pouco compicado do pessoal entender direito.

Rafael

As classes do java.util.* são muito úteis principalmente pq lidam com as pentelhações pra vc. Mas vc tem que ter mais “preguiça” na hora de bolar o código: quanto mais preguiça de escrever vc tiver, mais tempo vc ficará pensando nele, e descobrirá alguma forma “4-linhas” pra fazer aquilo.

Quando a gente lida com SQL, a parte que lê do banco fica grande mesmo, não tem jeito. Mas uma vez livre das classes do java.sql, vc pode brincar.

O seu Vector não sabe qual elemento é de cada tipo. Mas você sabe!

   while (rs.next()) {
      meuVector.add(new Integer(rs.getInt(1)));
      meuVector.add(new Double(rs.getDouble(2)));
      meuVector.add(rs.getString(3));
   }

Bom… primeiro vc guardou um inteiro, depois um double, depois um string. Hmmmm…

   Integer v0 = (Integer) meuVector.get(0);
   Double v1 = (Double) meuVector.get(1);
   String v2 = (String) meuVector.get(2);

Se vc não garante ordem, nao use uma lista (classes que implementam java.util.List). Use um mapa (classes que implementam java.util.Map): como vc não tem ordem na collection mas precisa de ordem quando for usar os dados, então vc tem que identificar os objetos de alguma forma.

Aqui no trampo a gente usa bastante, pra ler do banco de dados, combinações de List e Map, sendo que cada registro é um mapa. Um exemplo simples é assim:

   while(rs.next()) {
     Map map = new HashMap();
     map.put("Nome", rs.getString("Nome"));
     map.put("Idade", rs.getInt("Idade"));
     map.put("PesoEmMiligramas", rs.getLong("PesoEmMiligramas"));
    ...
     list.add(map);
   }

Como muito bem citou o Rafael Steil, evite Vector. Aliás, evite declarar uma variável diretamente pela classe quando há uma interface pra ela. Acima, usei uma variável com Map pra guardar um HashMap(); Se eu depois quiser mudar de mapa, eu vou ter certeza de que não usei alguma coisa exclusiva do HasmMap que outros mapas não possuem.

O caso do Vector é classico: o método getElementAt(int) só existe pq já estava antes das collections, e outras listas usam o método get(int). Dêem uma olhada no javadoc.

Putz grila, falei mais que a boca!!