Ordenacao de Matriz

8 respostas Resolvido
java
J

Olá Pessoal!

Tenho uma matriz java que é preenchida por números aleatórios:

public static void main(String[] args) {

int num[][] = new int[500][50];

String n = “”;

Random gerador = new Random();

int x;
//inicio do laço for para gravar os numeros gerados aleatoriamente
    for (int i = 0; i < 500; i++) {
        //inicio do laço for interno para gravar os numeros gerados aleatoriamente
        for (int j = 0; j < 50; j++) {
            num[i][j] = gerador.nextInt(10001);
            n += num[i][j];
            n += " ";
        }//fim do laço for interno para gravar os numeros gerados aleatoriamente
        n += "\n";
    }//fim do laço for para gravar os numeros gerados aleatoriamente
    
    JOptionPane.showMessageDialog(null, n + " ", "Informações Gravadas com Numeros Aleatorios", JOptionPane.INFORMATION_MESSAGE);        
}//fim do metodo construtor

Para ordenar esta Matriz fiz o seguinte:

//inicio do laço for para ordenar os numeros gerados aleatoriamente

for (int i = 0; i < 500; i++) {

//inicio do laço for interno para ordenar os numeros gerados aleatoriamente

for (int j = 0; j < 50; j++) {

while(num[i][j] > (num[i][j]+1)){

x = num[i][j];

num[i][j] = num[i][j] + 1;

num[i][j]+1 = x;//ESTA ACONTECENDO ERRO NESTA LINHA UNEXPECTED TYPE

}

}//fim do laço for interno para ordenar os numeros gerados aleatoriamente
}//fim do laço for para ordenar os numeros gerados aleatoriamente

Alguém pode me ajudar a solucionar este problema?

8 Respostas

B

o + 1 é uma atribuição, por tanto ele deve estar depois do igual, assim:

num[i][j] = x +1;

L

O blayd2015 deu a solução para o problema, se era realmente essa sua intenção.
Mas o seu algoritmo está apenas ordenando dentro de uma linha, era isso o que você queria? E esse algoritmo é um algoritmo beeeem ineficiente, tem algoritmos um pouco mais complexos, mas que tem soluções mais otimizadas. Se te interessar dar uma olhada pode dar uma lida aqui https://pt.wikipedia.org/wiki/Algoritmo_de_ordenação

J

Olá blayd2015!

Não Deu Certo!

J

Olá leonardodias914!

Estive vendo o link que você enviou, e percebi que os métodos de ordenação são todos para vetores e não para matriz!
Baseado nisto tentei fazer o seguinte:

  • Transformar a matriz em um Vetor:
//inicio do laço for para ordenar os numeros gerados aleatoriamente

for (int i = 0; i < 500; i++) {

//inicio do laço for interno para ordenar os numeros gerados aleatoriamente

for (int j = (i + 1); j < 50; j++) {

vet[i] = num[i][j];//MAS O LOG DO NETBEANS INFORMA O SEGUINTE ERRO: java.lang.NullPointerException. NESTA LINHA

Arrays.sort(vet);

}//fim do laço for interno para ordenar os numeros gerados aleatoriamente

}//fim do laço for para ordenar os numeros gerados aleatoriamente
//inicio do laço for para imprimir os numeros gerados de forma ordenada
    for (int i = 0; i < 500; i++) {
        //inicio do laço for interno imprimir os numeros gerados de forma ordenada
        for (int j = 0; j < 50; j++) {
            System.out.println(vet[i]);
        }//fim do laço for interno para imprimir os numeros gerados de forma ordenada
    }//fim do laço for para imprimir os numeros gerados de forma ordenada
B

o erro que estava ocorrendo não está mais…disso eu tenho certeza…o programa em si que ainda não funciona como esperado mais isso é lógica daí é outra pergunta…

R

Repare que você está tentando colocar uma matriz com 500*50 posições em um vetor que tem 500(Ou está percorrendo apenas 500)

//inicio do laço for para ordenar os numeros gerados aleatoriamente
 int k =0;
 for (int i = 0; i < 500; i++) {
 //inicio do laço for interno para ordenar os numeros gerados aleatoriamente
 for (int j = 0; j < 50; j++) {
 vet[k] = num[i][j];
 k++;

Acho que isso vai solucionar o erro.
*E eu não entendi o motivo de se atribuir i+1 ao j, dessa forma você não vai percorrer todos os valores da matriz.

L
Solucao aceita

Uma opção para você é a seguinte: Simular uma matriz utilizando um vetor. Uma matriz nada mais é do que um vetor quebrado em seções, usando isso a gente consegue simular muito bem.
Se você tiver uma matriz de n linhas e m colunas você pode criar um vetor nxm. Nesse caso você tem 500 linhas e 50 colunas, assim você precisa de um vetor de 25000 posições (500x50).
Mas como simular a matriz nisso?
Veja, a linha de número 0 é representada pelas posições 0 à 49, 50 elementos, correto?
A linha de número 1 é representada pelas posições 50 à 99, 50 elementos, certo?
Então se for a linha 0 você pode fazer 0 x 50 + coluna, a linha 1 é 1x50 + coluna, a linha 2 é 2x50 + coluna e assim segue até 499 (última linha).
Exemplo:
Então para acessar a posição (0,0) você faz 0x50 + 0,
para acessar a posição (0,40) você faz 0 x 50 + 40,
para acessar a posição (1,0) você faz 1x50 + 0,
para acessar a posição (400,20) você faz 400x50 + 20,
para acessar a última posição do vetor(499,49) você faz 499x50 + 49.

Dessa forma você consegue aplicar qualquer algoritmo de ordenação por vetor. Ordenar uma matriz é um processo bem chato mesmo, trabalhando dessa forma facilita bastante.

J

Olá leonardodias914!

Fiz justamente isto, baseado no link que me foi enviado anteriormente. Modifiquei o codigo, ficou como está descrito abaixo:

//inicio do metodo construtor

public static void main(String[] args) {

int num[] = new int[25000];

int menor, maior, x = 1;

String n = null;

Random gerador = new Random();
//inicio do laço for para gravar os numeros gerados aleatoriamente
    for (int i = 0; i < 25000; i++) {
        num[i] = gerador.nextInt(10001);
        n += num[i];
        n +=" ";
        if(i % 30 == 0){
            n += "\n";
        }
    }//fim do laço for para gravar os numeros gerados aleatoriamente
    
    System.out.println(n);
    //JOptionPane.showMessageDialog(null, n+ " ", "Informações Gravadas com Numeros Aleatorios", JOptionPane.INFORMATION_MESSAGE);

//ABAIXO FIZ A MATRIZ COM POSIÇÃO DE 0 A 25000, E FIZ TAMBÉM A ORDENAÇÃO!

//inicio do laço for para ordenar
    for(int i = 0;i < 25000;i++){
        menor = i;
        x = num[i];
        //inicio do laço for interno
        for(int j = i + 1;j < 25000;j++){
            if(num[j] < x){
                menor = j;
                x = num[j];
            }//fim do se
        }//fim do laço for interno
        num[menor] = num[i];
        num[i] = x;
    }//inicio do laço for para ordenar

//ABAIXO ESTÁ O CODIGO PARA IMPRIMIR O VETOR DE FORMA ORDENADA

//inicio do laço for para imprimir de forma ordenada
    for (int i = 0; i < 25000; i++){
        if(i % 30 == 0){
            System.out.println("*********************************");
        }
        System.out.printf("%5d", num[i]);
    }
}//fim do metodo construtor

Muito Obrigado!!!

Criado 10 de janeiro de 2018
Ultima resposta 13 de jan. de 2018
Respostas 8
Participantes 4