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
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