Ordenação de matriz

9 respostas
Y

Galera eu tenho uma matriz assim:

300 - 400
100 - 200
800 - 600

essa é minha matriz…eu gostaria de ordenar essa matriz mas usando a segunda coluna como referencia…colocar o 200 em primeiro ai o 400 vai para segundo…

alguem sabe o como?

Valeu

9 Respostas

T

Como é a matriz? É algo assim:

int [][] mat = {
   { 300, 400 },
   { 100, 200 },
   { 800, 600 },
};

Se for, dá para usar algo como

Arrays.sort (mat, new Comparator () {
    public int compare (Object o1, Object o2) {
        ...
    }
});

onde você precisa definir uma função compare que recebe dois Object, converte-os para int[], compara a posição [0], e se for igual, compara a posição [1]. Estou fazendo de cabeça, me corrija se estiver errado:

public int compare (Object o1, Object o2) {
    int[] a1 = (int[]) o1;
    int[] a2 = (int[]) o2;
    if (a1[0] == a2[0]) {
        return a1[1] < a2[1] ? -1 : (a1[1] > a2[1] ? +1 : 0);
    } else {
        return a1[0] < a2[0] ? -1 : +1;
    }
}

Edit - desculpe, não vi que era a posição 1 que você queria comparar primeiro, não a posição 0. Troque [0] por [1] e [1] por [0] no código acima.

Y

Obrigado pela ajuda e atenção!

M

E olha só, e se eu quiser ordenar uma matriz, mas de acordo com os valores de um outro vetor?

explicando melhor: tenho uma matriz com n linhas. E um vetor de tamanho n, onde cada posicao do vetor corresponde a sua respectiva linha na matriz. Ou seja, primeira linha da matriz vai ser ordenada de acordo com o valor do que tem na primeira posicao do vetor.

Quero ordenar essa matriz de acordo com os valores do vetor, tem como?

V

Sim, e é moleza, especialmente se vc criar uma outra matriz.

Exemplo:

int matriz = {10,2,30,4,50,6,70};
int index = {1,3,5,0,2,4,6};

int ordenada = new int[matriz.length];

for (int i = 0; i < matriz.length; i++)
  ordenada[i] = matriz[index[i]];
M

Mas isso nao funciona pq meu vetor nao tem os indices, tem valores quaisquer. Tipo, tenho uma matriz assim

matriz:
1 1 0 0 0 1
3 1 4 0 0 1
0 2 0 0 0 1
4 3 0 0 0 1
1 0 0 0 0 1

e um vetor assim
0.34
0.21
0.45
0.32
0.11

E quero ordenar minha matriz de forma que ordenando meu vetor, a matriz tb fique ordenada

V

Na verdade, faça a ordenação do vetor e, sempre que houver trocas nele, troque também na matriz.

M

Sim, se eu escrever o meu algoritmo de sort, é tranquilo fazer isso, a questão é que eu queria ver se nao podia usar algum sort pronto do java, mas acho que nao dá mesmo

V

Você pode fazer uma classe que faz a associação entre uma linha do vetor e uma da matriz, criar uma lista dessa classe e então fazer a ordenação dessa lista. Depois, se precisar alterar as outras estruturas, basta copia-las da lista ordenada do resultado.

Veja:

public class VetorAndMatrixSort {
    public static void main(String[] args) {
        int matrix[][] = {{1, 1, 0, 0, 0, 1}, 
                                  {3, 1, 4, 0, 0, 1},
                                  {0, 2, 0, 0, 0, 1},
                                  {4, 3, 0, 0, 0, 1},
                                  {1, 0, 0, 0, 0, 1}};
        double vector[] = {0.34, 0.21, 0.45, 0.32, 0.11};
        
        List<VectorAndMatrixLine> lines = new ArrayList<VectorAndMatrixLine>();
        
        for (int i = 0; i < vector.length; i++)
            lines.add(new VectorAndMatrixLine(i, vector[i], matrix[i]));
        
        Collections.sort(lines);
        
        System.out.println("Vector     Matrix Line");
        for (VectorAndMatrixLine line : lines) {
            System.out.printf(" %.2f       %s", line.getValor(), line.getMatrizStr());
            System.out.println();
        }
    }
}

class VectorAndMatrixLine implements Comparable<VectorAndMatrixLine> {
    private int matriz[];
    private double valor;
    private int index;
     
    public VectorAndMatrixLine(int index, double valor, int matriz[]) {
        this.index = index;
        this.valor = valor;
        this.matriz = matriz;
    }

    public String getMatrizStr() {
        StringBuilder str = new StringBuilder();
        for (int value : matriz)
            str.append(value).append(" ");
        return str.toString();
    }

    public int compareTo(VectorAndMatrixLine o) {
        return valor > o.valor ? 1 : (valor < o.valor ? -1 : 0);
    }
    
    public int[] getMatriz() {
        return matriz;
    }
    
    public double getValor() {
        return valor;
    }
    
    public int getIndex() {
        return index;
    }
}

é um pouco trabalhoso, mas é melhor que implementar na mão um ImprovedQuickSort, com certeza!

M

Valeuuuu. Realmente, é trabalhosinho, mas muito menos do que fazer um quicksort na mao, com certeza

Criado 3 de junho de 2005
Ultima resposta 20 de mar. de 2008
Respostas 9
Participantes 4