Mergesort

Sr´s, bom dia !!

O Código abaixo feito com um MergeSort, faz com que seja feita uma ordenação por nome , porém eu preciso fazer com que, se houver algum aluno a mais com o mesmo nome, o vetor seja ordenado pela matricula, porém não sei como fazer…vocês poderiam clarear as ideias para mim ?

será que é necessário criar um novo vetor de matricula no método intercala?

Obrigado.


public class TesteMergeSort {

    public static void main(String[] args){
        
        Aluno rafael = new Aluno("Rafael",100000,13);
        Aluno sakurai = new Aluno("Sakurai",100023,20);
        Aluno cristiano = new Aluno("Cristiano",101010,3);
        Aluno rafael2 = new Aluno("Rafael",100011,10);
        
        Aluno[] alunos = {rafael, sakurai, cristiano, rafael2};
        
        mergeSort(0, alunos.length, alunos);
        
        for(int tamanho = 0; tamanho < alunos.length; tamanho++){
            
         System.out.println(alunos[tamanho].getNome() + " - "  + alunos[tamanho].getMatricula()+ " - " +
                 alunos[tamanho].getNumChamada());   
            
         }
     }


    private static void mergeSort(int inicio, int fim, Aluno[] alunos){
        
        if(inicio < fim - 1){
            
            int meio = (inicio + fim) / 2;
            
        mergeSort(inicio, meio, alunos);    
            
        intercala(alunos, inicio, meio, fim);    
      }
    }    
   
    private static void intercala(Aluno[] alunos, int inicio, int meio, int fim){
        
       Aluno novoVetor[] = new Aluno[fim - inicio];
       
       int i = inicio;
       
       int m = meio;
       
       int pos = 0;
       
     while(i <  meio && m < fim){
         
         if(alunos[i].getNome().compareToIgnoreCase(alunos[m].getNome()) <=0){
             
             novoVetor[pos] = alunos[i];
             pos = pos + 1;
             i = i + 1;
         }
         else{
             novoVetor[pos] = alunos[m];
             pos = pos + 1;
             m = m + 1;
         }
     }  
        
         
     while(i < meio){
         
         novoVetor[pos] = alunos[i];
         pos = pos + 1;
         i = i + 1;
     }   
        
     while(m < fim){
         
         novoVetor[pos] = alunos[m];
         pos = pos + 1;
         m = m + 1;
     }   
        
    
    for(pos = 0, i = inicio; i<fim; i++, pos++){
        
        alunos[i] = novoVetor[pos];
    }
  }
}

Implemente a interface Comparable dentro de Aluno, e chame aluno[i].compareTo(aluno[m]) na hora de comparar.

Modifique a condição acima, para que inclua na comparação o número da matrícula também.

Como a condição vai ficar um pouco extensa, encapsule-a em um método privado de sua classe, para facilitar.

Outra forma, mais elegante, é fazer como o renrutal sugeriu.

Então, vejamos se eu entendi…

implementado a interface COMPARABLE na minha classe ALUNO, em vez de usar o meu código assim:

(alunos[i].getNome().compareToIgnoreCase(alunos[m].getNome()) <=0) 

devo usá-lo assim:

 aluno[i].compareTo(aluno[m])

e o sistema já subentende que deverá ser comparado nome e matricula? ou preciso também colocar desta forma também: matricula[i].compareTo(matricula[m])

ou senão seria assim:

if (alunos[i].getNome().compareToIgnoreCase(alunos[m].getNome()) <=0) { ... ... .. } else if (alunos[i].getMatricula().compareToIgnoreCase(alunos[m].getMatricula()) <=0){ ... ... ..

Obrigado.

Implementar a interface Comparable quer dizer que você vai criar um método chamado compareTo dentro da sua classe Aluno, e esse método vai dizer a ordem de comparação entre dois alunos.

Dentro dele você vai tratar tanto dos casos de nomes iguais quanto de matrículas.

Dê uma olhada no javadoc do Comparable, lá explica tudo.

PS: Não existe subentendimento em programação. Computadores não entendem nada.