ArrayList de matrizes não acessa a posição indicada pelo índice

6 respostas
F

Olá, pessoal. Não consigo acessar um determinado registro em um ArrayList pela posição. Já vi em várias fontes (incluseve na IDE do NetBeans) a forma de acessar uma determinada posição, mas por algum motivo que eu não consigo ver, não está acessando, e sim a primeira posição. Fiz o código de quatro formas, vou postar aki de duas pra vocês terem uma noção. O método abaixo deve fazer uma varredura em um ArrayList e verificar qual registro possui o maior primeiro elemento da matriz (por exemplo A[0][0] > A[1][0]). Vou tentar comentar o código para facilitar.

Forma 1:
public int[][] menorX (){
        int i, posicao, xMenor;
        int[][] vetorPontos = new int[20][2];
        
        vetorPontos = listaDePontos.get(0); //passa a matriz da primeira posição do ArrayList para a matriz vetorPontos
        xMenor = vetorPontos[0][0]; //armazena na variável xMenor o valor do primeiro elemento da primeira posição da matriz
        posicao = 0; //armazena a posição do menor valor (no caso, 0)
        
        for(i=1; i<listaDePontos.size(); i++){ //percorre o ArrayList da posição até a última posição
            vetorPontos = listaDePontos.get(i); //armazena em vetorPontos o i-ésimo elemento do ArrayList
            if (vetorPontos[i][0] < xMenor){ //compara o menor elemento até o momento com o elemento atual
                xMenor = vetorPontos[i][0]; //armazena o novo menor elemento
                posicao = i; //armazena a posição do novo menor elemento
            }
        }
        //nesta próxima atribuição é o problema
        vetorPontos = listaDePontos.get( posicao); //DEVERIA armazenar o elemento da posição [i]posição[/i], mas armazena SEMPRE o primeiro elemento do ArrayList
        
        //ja tentei assim tambem:
        //vetorPontos = listaDePontos.get( (int) posicao); // o mesmo erro

        return vetorPontos; //retorna a matriz
    }
Forma 2:
public int[][] menorX (){
        int i, posicao, xMenor;
        int[][] vetorPontos = new int[20][2];
        
        vetorPontos = listaDePontos.get(0); //passa a matriz da primeira posição do ArrayList para a matriz vetorPontos
        xMenor = vetorPontos[0][0]; //armazena na variável xMenor o valor do primeiro elemento da primeira posição da matriz
        posicao = 0; //armazena a posição do menor valor (no caso, 0)
        
        for(i=1; i<listaDePontos.size(); i++){ //percorre o ArrayList da posição até a última posição
            vetorPontos = listaDePontos.get(i); //armazena em vetorPontos o i-ésimo elemento do ArrayList
            if (vetorPontos[i][0] < xMenor){ //compara o menor elemento até o momento com o elemento atual
                xMenor = vetorPontos[i][0]; //armazena o novo menor elemento
                posicao = i; //armazena a posição do novo menor elemento
            }
        }
        //nesta próxima atribuição é o problema
        vetorPontos = listaDePontos.remove( posicao); //DEVERIA armazenar o elemento da posição [i]posição[/i], mas armazena SEMPRE o primeiro elemento do ArrayList
        
        //ja tentei assim tambem:
        //vetorPontos = listaDePontos.remove( (int) posicao); // o mesmo erro

        return vetorPontos; //retorna a matriz
    }

Só pra destacar, o programa não tem nenhum erro além deste citado. Já usei System.out para verificar todos valores e tudo confere.
Se alguem ver erro em qualquer uma das formas, me avise, por favor. Vlw!

6 Respostas

fabiocortolan

Estou sem tempo para analisar agora, mas não está mudando o valor da variável posicao pq parece q não está entrando na condição if:

if (vetorPontos[i][0] &lt; xMenor){ // Provavelmente não entra aki em nenhum momento
    xMenor = vetorPontos[i][0];  
    posicao = i;  
}
F

fabiocortolan, grato por responder, mas o problema nao eh esse. Eu mando exibir os valores de xMenor e posicao ao término da varredura e os valores armazenados são corretos. O problema está na passagem pelo índice. Inclusive, já tentei até mesmo foraçar o índice e ainda assim sempre passou a primeira posição.

Forçando o índice:
vetorPontos = listaDePontos.get( 3);

 //ja tentei assim tambem:  
//vetorPontos = listaDePontos.get( (int) 3);
E

Por obséquio, a declaração do arraylist ( listaDePontos ) …

F
ArrayList<int[][]> listaDePontos = new ArrayList();

Essa ai. A declaração é global (caso influencie em algo…).

E

Certo. Como você adicionou os elementos a esse arraylist?

Só lembrando que você escreveu isto neste programa:

int[][] vetorPontos = new int[20][2]; // criou um array de arrays...
          
        vetorPontos = listaDePontos.get(0);  // que foi simplesmente jogado fora, quando você atribuiu o valor retornado por listaDePontos.get(0).

Então pelo menos você deve ter adicionado (add) um array de arrays de inteiros a essa variável “listaDePontos” em algum lugar, certo?

F
entanglement:
Certo. Como você adicionou os elementos a esse arraylist? Só lembrando que você escreveu isto neste programa:
int[][] vetorPontos = new int[20][2]; // criou um array de arrays...
          
        vetorPontos = listaDePontos.get(0);  // que foi simplesmente jogado fora, quando você atribuiu o valor retornado por listaDePontos.get(0).

Então pelo menos você deve ter adicionado (add) um array de arrays de inteiros a essa variável "listaDePontos" em algum lugar, certo?

Sim, sim. vou colocar o código completo pra ficar mais claro. Tem algumas mudanças que fiz pra ver se dava certo. Tanto a variável lista como a image estão corretas, pois já verifiquei usando o System.out e a graphic. No código abaixo, consigo armazenar o valor correto na variável vetorPontos, o problema está apenas no listaDePontos.remove(posicao);.

public class IdentificarPontos {
    
    ArrayList<int[][]> listaDePontos = new ArrayList();
    BufferedImage imagem;
    
    public IdentificarPontos (ArrayList lista, BufferedImage image){
        listaDePontos = lista;
        imagem = image;
        
        ordenarPontos();
    }
    
    public void ordenarPontos(){
        
        
        String[] nomePontos = {"P0", "P1", "P2", "P3"};
        int i;
        ArrayList<int[]> listaDePontosOrdenados = new ArrayList();
        
        listaDePontosOrdenados.add(menorX());
        listaDePontosOrdenados.add(menorX());
        listaDePontosOrdenados.add(menorX());
        listaDePontosOrdenados.add(menorX());
        
        Graphics g = imagem.getGraphics();  
        g.drawImage(imagem, 0, 0, null);  
        g.setFont(new Font("Arial", Font.BOLD, 18));
        
        for (i=0; i<listaDePontosOrdenados.size(); i++){
            g.drawString(nomePontos[i], listaDePontosOrdenados.get(i)[0], listaDePontosOrdenados.get(i)[1]);
        }
    }
    
    public int[] menorX (){
        int i, posicao, xMenor;
        int[][] vetorPontos = new int[listaDePontos.size()][2];
        
        vetorPontos = listaDePontos.get(0);
        xMenor = vetorPontos[0][0];
        posicao = 0;
        
        for(i=1; i<listaDePontos.size(); i++){
            vetorPontos = listaDePontos.get(i);
            if (vetorPontos[i][0] < xMenor){
                xMenor = vetorPontos[i][0];
                posicao = i;
            }
        }
        listaDePontos.remove(posicao); //remove o primeiro elemento e não o da posição 'posicao'
        return vetorPontos[posicao]; //retorna o valor correto
    }
    
}
Na outra classe, faço a inserção na lista que serve de entrada para a classe acima da seguinte forma (o código não está completo, postei só a parte de interesse):
//global
static ArrayList<int[][]> listaDePontos = new ArrayList();
static int numeroPontos = 0;
static int[][] vetorPontos = new int[20][2];

public void marcaPonto (int x, int y) throws IOException {
        //colocar as altura e largura corretas
        if ((y <= altura) && (x <= largura))
        {
            //armazenarPonto(x, y, pixel);
            vetorPontos[numeroPontos][0] = x;
            vetorPontos[numeroPontos][1] = y;
            numeroPontos++;
            
            listaDePontos.add(vetorPontos);
         }
}
Criado 30 de abril de 2013
Ultima resposta 30 de abr. de 2013
Respostas 6
Participantes 3