Ordenação de matriz

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

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.

Obrigado pela ajuda e atenção!

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?

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

Exemplo:

[code]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]];[/code]

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

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

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

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:

[code]
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 {
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;
}

}[/code]

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

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