Array bidimensional

25 respostas
C

SEGUE MEU CODIGO.

String[][] viagensSiigre = new String[1][4];
while (rsSiigre.next()) {
      for(int c=0;c<viagensSiigre.length;c++){
             for(int li=0;li<viagensSiigre[c].length;li++){
                    viagensSiigre[c][li] = rsSiigre.getString("LINHA");
                    viagensSiigre[c][li] = rsSiigre.getString("MATMOT");
                    viagensSiigre[c][li] = rsSiigre.getString("HORINI");
                    viagensSiigre[c][li] = rsSiigre.getString("HORTER");

A ALIMENTAÇÃO ACONTECE MAIS SOBREESCREVE PORQUE NÃO ENCONTRO UMA MANEIRA DE ALTERAR O VALOR DA LINHA E SE PASSO FIXO ELE ME DA ERRO DE VAZIO.

25 Respostas

pmlm

Penso que o que queres será algo assim:

String[][] viagensSiigre = new String[1][4];  //apenas 1? Vais ignorar os resultados seguintes do result set
while (rsSiigre.next()) {
    for(int c=0;c<viagensSiigre.length;c++){
         viagensSiigre[c][0] = rsSiigre.getString("LINHA");
         viagensSiigre[c][1] = rsSiigre.getString("MATMOT");
         viagensSiigre[c][2] = rsSiigre.getString("HORINI");
         viagensSiigre[c][3] = rsSiigre.getString("HORTER");
    }
}
C

Na verdade queria colocar pelo tamanho do resultset,

int col=4;
String[][] viagensSiigre = new String[rscount][col];
                                
while (rsSiigre.next()) {
     rscount = rscount + 1;

tipo assim né ?

C
String[][] viagensSiigre = new String[rowcount][4];
while (rsSiigre.next()) {
                     
    for(int c=0;c<=rowcount;c++){
               viagensSiigre[c][0] = rsSiigre.getString("LINHA");
               viagensSiigre[c][1] = rsSiigre.getString("MATMOT");
               viagensSiigre[c][2] = rsSiigre.getString("HORINI");
               viagensSiigre[c][3] = rsSiigre.getString("HORTER");

coloquei desse jeito …

e quando rodo o array não acha o indice

Exception in thread “main” java.lang.ArrayIndexOutOfBoundsException: 0

por isso que não estava passando os numeros…

pmlm

Como obtens esse rowcount? Qual o seu valor quando executas?

C

eu passo 0 pra ele … mais preciso que ele seja a quantidade de vezes que o banco retorna.
ou seja se eu tiver 2 registros quero que ele seja 2 …

sei até como fazer isso …

while (rs.next()){ rowcount = rowcount+1}

mais se faço isso não consigo correr com meu rs depois … terei que fazer a query no banco novamente …

pmlm

Aqui está o teu erro…

Mas aqui já criaste o array e o tamanho não vai mudar.

Tens de usar obrigatoriamente array neste trabalho?
Se sim, deves fazer primeiro uma outra query com o count(*) para saberes o número de registos.
Se não, podes usar ArrayList, que não é preciso definir inicialmente o tamanho.

C

quando eu uso array list tenho que fazer um for Interetor … mais não sei utilizar direito … porque não consigo dizer pro interator como adicionar meus campos na outra dimensao

não sei usar muito bem o array list

por exemplo …

eu ate populo ele mais quando vou pegar as variaveis … não sei como fazer o add

pmlm

Sem complicar mais, e pegando neste exemplo, so precisas de fazer antes:

PreparedStatement stmtCount = conn.prepareStatement("SELECT COUNT(*) as total FROM ......");
ResultSet rsCount = stmtCount.executeQuery();
int rowcount = 0;
if (rsCount.next()) {
    rowcount = rsCount.getInt("total");
}

 // o teu codigo atual
PreparedStatement stmt =....
ResultSet rs = stmt.executeQuery(); 
String[][] viagensSiigre = new String[rowcount][4];
C

acabei de fazer isso … muito obrigado mesmo … funcionou … mais ta trazendo linhas duplicadas … vou analizar aqui minha logica … mais tive que abrir outra consulta mesmo …

pmlm

Ha uma maneira de não ter de fazer esta consulta “extra” que era, na tua consulta inicial, deslocar o resultset para o final e obter o numero de linhas e depois voltar a deslocar para o inicio para leres as linhas. Esta prática é desaconselhada uma vez que para chegares ao fim do result set estás a ler todos os dados e a descartar para depois voltares a ler e utilizar. Em result sets grandes esta operação pode ser pesada.
A melhor forma é mesmo fazer a conulta adicional da contagem.

C
while (rsSiigre.next()) {
                        for(int c=0;c<rowcount;c++){
                            if (li==0){
                             viagensSiigre[c][li] = rsSiigre.getString("LINHA");
                             System.out.println("LINHA: " + viagensSiigre[c][li]);
                             li=li+1;
                            }if (li==1){
                             viagensSiigre[c][li] = rsSiigre.getString("MATMOT");
                             System.out.println("MATRICULA: " + viagensSiigre[c][li]);
                             li=li+1;
                            }if (li==2){
                             viagensSiigre[c][li] = rsSiigre.getString("HORINI");
                             System.out.println("HORA INICIO: " + viagensSiigre[c][li]);
                             li=li+1;
                            }if(li==3){
                             viagensSiigre[c][li] = rsSiigre.getString("HORTER");
                             System.out.println("HORA FIM: " + viagensSiigre[c][li]);
                             li=0;
                            }
C

estou fazendo assim pra incrementar as linhas … estão duplicando tudo … =(

vou ter que varrer a linha de outra forma que ainda não estou visualizando

pmlm

Para que complicar? Dessa forma estás a ler só um campo por linha.

Usa o que ja tinha posto acima:

for(int c=0;c<=rowcount;c++){
    viagensSiigre[c][0] = rsSiigre.getString("LINHA");
    viagensSiigre[c][1] = rsSiigre.getString("MATMOT");
    viagensSiigre[c][2] = rsSiigre.getString("HORINI");
    viagensSiigre[c][3] = rsSiigre.getString("HORTER");
}
pmlm

De certeza que o problema da duplicação não está no teu select? Faltará alguma condição em um join?

C

não tem join não … deve ser essa logica mesmo é que quando estava fazendo assim não estava funcionando

vou tentar agora depois de incrementar o resultset

pmlm

Espera, percebi o erro! Tens um while e um for. Só precisas de um ciclo!

int c = 0;
while (rsSiigre.next()) {
    viagensSiigre[c][0] = rsSiigre.getString("LINHA");
    viagensSiigre[c][1] = rsSiigre.getString("MATMOT");
    viagensSiigre[c][2] = rsSiigre.getString("HORINI");
    viagensSiigre[c][3] = rsSiigre.getString("HORTER");
    c++;
}
C

IUHAisuhasuihaiushaus …

massa mesmo … ficou lindo demais assim … dessa forma até parece facil … como pode né …

entender das coisas é muito bom … amigo … muito obrigado … assim que terminar esse projeto vou te abençoar com $$ … só esperar … gosto de fazer parcerias … hehe =)

pmlm

Isto é trabalho de escola? Na “vida real” deverias usar um objecto e não as 4 posições do array :slight_smile:

C

vou usar esse array pra comparar com outros dados que ainda vou puxar do banco …

como seria esse padrão de objetos…

C

esse foi pra popular o array com as viagens ocorridas

viagenssiigre[][]

vou montar outro array do mesmo jeito com outra query

viagensoutro[][]

e vou comparar os valores …

vc acha uma boa solução ?

pmlm

Deves criar uma class Viagem, com os atributos que precisas: linha, matmot,horini, horfim e depois, podendo manter o array para as viagens, seria:

Viagem[]viagensSiigre = new Viagem[rowcount];
int c = 0;
while (rsSiigre.next()) {
    Viagem v = new Viagem();
    v.setLinha(rsSiigre.getString("LINHA"));
    v.setMatmot(rsSiigre.getString("MATMOT"));
    v.setHorini(rsSiigre.getString("HORINI"));
    v.setHorter(rsSiigre.getString("HORTER"));
    viagensSiigre[c++] = v;
}

Claro que se ainda estás a aprender e o objetivo é mesmo aprender arrays mulltidimensionais, a tua solução já está boa :slight_smile:

C

Do jeito que vc fez ficou massa … mais mesmo assim acho que não conseguirei trabalhar com isso … as viagens não tem ponto de comparação a não ser as posições do array … com isso não sei como seria pra comprar as classes ???

C

Não entendi como vou varrer essa classe depois ?!??!

cada viagens[1]getlinha = UM REGISTRO ???

pmlm

viagens[0] é uma viagem

viagens[0].getLinha() da a linha dessa viagem

viagens[0].getHrini() a hora de inicio dessa viagem

C

entendi … mesmo que pra mim venha 1000 viagens … ele sempre vai trabalhar a classe com a posição

depois é só eu chamar a classe e trabalhar varrendo o array …

caraca … entendi …

Criado 23 de agosto de 2016
Ultima resposta 24 de ago. de 2016
Respostas 25
Participantes 2