Melhorar esse código

3 respostas
nilsoncastro

Pessol to lendo um arquivo texto com o resultado de um concurso. To separando os nomes através da "/" e separando tb a nota de cada um, porem ao ordenar as notas nao sei como puxar os nomes das pessoas melhores classificadas.
Alguem tem sugestao pra melhorar esse código? Vou mandar tb o arquivo texto q tou usando

import java.io.*;

/**
 *
 * @author nilson
 */
public class NovoClass {
    
    public String retornaString(String fileName) throws IOException {

        BufferedReader in = new BufferedReader(new FileReader(fileName));
        String line;
        StringBuffer buffer = new StringBuffer();

        while( (line = in.readLine()) != null ){
            buffer.append(line + "\n");
        }

        in.close();
        return buffer.toString();

    }
  
   
     public static void main(String args[]) {
        String teste="", output = "";
        String vet[];
        double not[];
        Ler t = new Ler();
        try {
            teste = t.retornaString("C:\tre_notas.txt");
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        int count = 0, i = 0;
        vet = new String[teste.length()+1];
        while  (count < teste.length()){ 
            if (teste.charAt(count)!='/')
               vet[i]+=teste.charAt( count );
            else
               i++;
             
             count++;            
        }
        int indice = i - 1;
        not = new double[teste.length()+1];
        for (i=0;i<indice;i++)
        {
            String aux="",pal;
            pal=vet[i].substring(vet[i].length()-5,vet[i].length()-1);
            aux+=pal.charAt(0)+"."+pal.charAt(2)+pal.charAt(3);
            not[i]=Double.parseDouble(aux);
        }   
        for (i=0;i<indice;i++)
        {
            int k = i;
            for (int j = i + 1; j < indice; j++)
               if ( not [ j ] < not [ k ] )
                  k = j;
            swap( not,k, i );        
        
          
    }
        int j=1;
      for (i=indice-1;i>=0;i--)
      {
          
          System.out.println(j+":"+" "+Double.toString(not[i]));
        j++;
      }
     }     

        public static void swap ( double [ ] v, int j, int aposJ )
      {
         double aux = 0.0;
         aux = v [ j ];
         v [ j ] = v [ aposJ ];
         v [ aposJ ] = aux;
      }
    
}

3 Respostas

Roger75

Vou dar uma sugestão: crie uma classe Pessoa com os atributos nome e nota. A cada registro do txt que você ler crie um objeto Pessoa com os atributos, e vá guardando num ArrayList.

Faça um Comparator para ordenar pela nota. Depois, pra fazer a ordenação você faz um Collections.sort(…), que a sua lista vai ser ordenada.

T

Leia e entenda a solução ao seu problema. Basicamente é uma aplicação do que o Roger75 lhe sugeriu.

Não use "bubblesort" como você estava fazendo. Isso é lento (mesmo para umas poucas centenas de elementos, como você fez) e nem um pouco profissional.

import java.util.*;
import java.io.*;

class Candidato {
    public int numero;
    public String nome;
    public double nota;
    
    public Candidato (int pNumero, String pNome, double pNota) {
        numero = pNumero;
        nome = pNome;
        nota = pNota;
    }
}

class CandidatoComparator implements Comparator {
    public int compare (Object o1, Object o2) {
        Candidato c1 = (Candidato) o1;
        Candidato c2 = (Candidato) o2;
        // primeiro comparar a nota (decrescente), depois o nome (crescente), e por fim o número (crescente)
        if (c1.nota &lt c2.nota) return +1;
        else if (c1.nota &gt c2.nota) return -1;
        int r = c1.nome.compareTo(c2.nome);
        if (r != 0) return r;
        if (c1.numero &lt c2.numero) return -1;
        else if (c1.numero &gt c2.numero) return +1;
        return 0;
    }
}


class RelatorioConcurso {
    public static void main(String[] args) {
        Set candidatos = new TreeSet (new CandidatoComparator());
        // O arquivo de candidatos é difícil de ler (porque os candidatos estão
        // separados por "/", não por linhas). Portanto, para facilitar, e como
        // o arquivo é pequeno, vamos criar uma string gigante.
        StringBuffer sb = new StringBuffer();
        String linha = null;
        try {
                BufferedReader br = new BufferedReader (new FileReader ("tre_notas.txt"));
                while ((linha = br.readLine()) != null) {
                    sb.append (linha);
                }
                br.close();
        } catch (IOException ex) {
            ex.printStackTrace();
            System.exit (1);
        }
        String conteudoArquivoCandidatos = sb.toString();
        // Agora vamos separar os candidatos
        String[] dadosCandidatos = conteudoArquivoCandidatos.split ("/");
        // Exemplo típico de um dadosCandidatos: " 00001158, Adalberto Pereira da Silva, 7,37 ". 
        // Ao separar os componentes, vou ter algo como:
        // " 00001158", " Adalberto Pereira da Silva", " 7", "37"
        for (int i = 0; i &lt dadosCandidatos.length; ++i) {
            String[] componentes = dadosCandidatos[i].split(",");
            int numero = Integer.parseInt (componentes[0].trim());
            String nome = componentes [1].trim();
            double nota = Integer.parseInt (componentes[2].trim()) + Double.parseDouble ("0." + componentes[3].trim());
            Candidato candidato = new Candidato (numero, nome, nota);
            candidatos.add (candidato);
        }
        // Agora vamos listar os candidatos
        // Fica a seu encargo formatar corretamente o número e a nota de cada
        // candidato :P
        for (Iterator it = candidatos.iterator(); it.hasNext(); ) {
            Candidato candidato = (Candidato) it.next();
            System.out.println (candidato.numero + " : " + candidato.nome + " : " + candidato.nota);
        }
        
    }
}
nilsoncastro

Legal essa solução, a princípio queria só ver minha colocação (aliás não foi boa). Agora vou fazer com calma pra aprender boas práticas de programação
Obrigado

Criado 4 de abril de 2007
Ultima resposta 4 de abr. de 2007
Respostas 3
Participantes 3