Ordenar conteúdo de um ficheiro por ordem crescente (números inteiros)
5 respostas
N
noorders
Olá.
Será que me podiam ajudar?
Eu tenho um ficheiro alunos.txt com a informação de alguns alunos lá dentro com esta formatação:
[list]
2030745/João Miguel
1050623/Manuela Serqueira
6074852/Rafael Sousa
[/list]
E queria ler esse ficheiro, depois de o ler, ordenar o conteúdo do mesmo por ordem numérica por ordem crescente e gravar num novo ficheiro alunos2.txt com esta formatação:
[list]
1050623/Manuela Serqueira
2030745/João Miguel
6074852/Rafael Sousa
[/list]
Para já, o código que tenho feito é este:
importjava.io.File;importjava.io.FileNotFoundException;importjava.util.Formatter;importjava.util.Scanner;publicclassExParaResolver{staticfinalintMAX=100;//define a capacidade máxima dos vectores que eu entenderpublicstaticvoidmain(String[]args)throwsFileNotFoundException{Scannerinput=newScanner(newFile("Alunos.txt"));//leitura deste ficheiro já criadoFormatteroutput=newFormatter(newFile("Alunos2.txt"));//escrita num novo ficheiroString[]dados=newString[3];Stringlinha,nome;intnum,idade;while(input.hasNext()){//ler o ficheirolinha=input.nextLine();//leitura linha a linhadados=linha.split("/");//usado para separar as Strings quando conhecemos o caracter.num=Integer.parseInt(dados[0]);nome=dados[1];idade=Integer.parseInt(dados[2]);ordenarFich(dados);}if(input!=null){//fechar ficheiro após a leiturainput.close();}output.close();}publicstaticvoidordenarFich(String[]dados){}/*Penso que estes são os métodos que tenho que usar/criar para a resolução do exercício: ler, ordenar, escrever, coordenar */}
Será que podem ajudar?
É que eu não sei como posso ordenar o conteúdo num array ao mesmo tempo que estou lendo o ficheiro, também não sei se é esse o procedimento adequado.
Aguardo vossa ajuda
O código numérico tem tamanho fixo (7 dígitos)? Se quiser ir lendo e já ficando com os dados ordenados, e se seu arquivo é pequeno suficiente para caber na memória do Java, então você pode simplesmente usar um TreeSet, que depois ele pode ser percorrido e já estar na ordem esperada.
N
noorders
Olá entanglement.
Sim, o código numérico tem tamanho fixo de 7 digítos.
Desculpe a ignorância, mas eu não faço ideia de como devo implementar essa sua ideia de usar um TreeSet.
Podia dar um exemplo de como eu deveria fazer?
Abraço
E
entanglement
Se seu arquivo é pequeno suficiente para caber em memória, e como o código numérico aparentemente tem tamanho fixo, é bastante simples ordenar o arquivo.
Vou dar um exemplo bem simples. Você pode adaptar para seu uso.
packageguj;importjava.io.BufferedReader;importjava.io.BufferedWriter;importjava.io.File;importjava.io.FileReader;importjava.io.FileWriter;importjava.io.IOException;importjava.util.SortedSet;importjava.util.TreeSet;publicclassExemploOrdenarArquivo{/** * Ordena em memória arqEntrada e joga o resultado em arqSaida * @param arqEntrada O nome do arquivo de entrada * @param arqSaida O nome do arquivo de saída * @throws IOException Se houver algum problema */publicvoidordenar(FilearqEntrada,FilearqSaida)throwsIOException{BufferedReaderbr=null;BufferedWriterbw=null;// Contém as linhas ordenadas, sem duplicaçãoSortedSet<String>linhasOrdenadas=newTreeSet<String>();// Lê as linhas do arquivo de entradatry{br=newBufferedReader(newFileReader(arqEntrada));for(Stringlinha=br.readLine();linha!=null;linha=br.readLine()){// O método "add" vai adicionando a "linhasOrdenadas" de forma// que o conjunto fique sempre ordenado.linhasOrdenadas.add(linha);}}finally{if(br!=null)try{br.close();}catch(IOExceptionex){}}StringlineSeparator=System.getProperty("line.separator");// Grava as linhas do arquivo de saídatry{bw=newBufferedWriter(newFileWriter(arqSaida));// Forma de percorrer linhasOrdenadas de forma ordenada.for(Stringlinha:linhasOrdenadas){bw.write(linha);bw.write(lineSeparator);}}finally{if(bw!=null)try{bw.close();}catch(IOExceptionex){}}}/** * Exemplo: java -cp . ExemploOrdenarArquivo arquivoEntrada.txt arquivoSaida.txt * @param args */publicstaticvoidmain(String[]args)throwsIOException{if(args.length!=2){System.err.println("Sintaxe: java -cp . ExemploOrdenarArquivo arquivoEntrada.txt arquivoSaida.txt");System.exit(1);}newExemploOrdenarArquivo().ordenar(newFile(args[0]),newFile(args[1]));}}
N
noorders
Olá.
Antes de mais peço desculpa pelo atraso.
Eu tentei resolver desta forma:
importjava.io.File;importjava.io.FileNotFoundException;importjava.util.Formatter;importjava.util.Scanner;publicclassExParaResolver{staticfinalintMAX=100;//define a capacidade máxima dos vectores que eu entenderpublicstaticvoidmain(String[]args)throwsFileNotFoundException{ScannerfIN=newScanner(newFile("C:\Users\Ricardo Jorge\Documents\NetBeansProjects\PL8.TP8\Alunos.txt"));//leitura deste ficheiro já criadoFormatterout=newFormatter(System.out);String[]dados=newString[3];String[]dadosJuntos=newString[MAX];String[]dadosOrd=newString[MAX];Stringlinha,nome;intnum,idade,i=0;while(fIN.hasNext()){//ler o ficheirolinha=fIN.nextLine();//leitura linha a linhadados=linha.split("/");//usado para separar as Strings quando conhecemos o caracter.num=Integer.parseInt(dados[0]);nome=dados[1];idade=Integer.parseInt(dados[2]);dadosJuntos[i]=dados[0]+dados[1]+dados[2];i++;}if(fIN!=null){//fechar ficheiro após a leiturafIN.close();}out.format("Conteúdo do vector dadosJuntos: ");for(intj=0;j<dadosJuntos.length;j++){out.format(dadosJuntos[j]);}dadosOrd[MAX]=ordenar(dadosJuntos);out.format("Conteúdo do novo ficheiro: ");for(intj=0;j<dadosOrd.length;j++){out.format(dadosOrd[i]);}escrever(dadosOrd);}/*Penso que estes são os métodos que tenho que usar/criar para a resolução do exercício: ler, ordenar, escrever, coordenar */privatestaticStringordenar(String[]dadosOrd){Stringtexto1="",texto2="",txt_num1="",txt_num2="",a="";intn1,n2;for(inti=0;i<dadosOrd.length;i++){texto1=dadosOrd[i];for(intk=i+1;k<dadosOrd.length;k++){texto2=dadosOrd[k];for(intj=0;j<7;i++){txt_num1+=texto1.charAt(j);txt_num2+=texto2.charAt(j);}n1=Integer.valueOf(txt_num1).intValue();n2=Integer.valueOf(txt_num2).intValue();if(n1>n2){a=dadosOrd[k];dadosOrd[i]=dadosOrd[k];dadosOrd[k]=a;}else{a=dadosOrd[i];dadosOrd[k]=a;}a="";txt_num1="";txt_num2="";}}returndadosOrd[MAX];}privatestaticvoidescrever(String[]dadosOrd)throwsFileNotFoundException{//abrir o ficheiro alunos2.txt para escritaFormatterfOUT=newFormatter(newFile("C:\Users\Ricardo Jorge\Documents\NetBeansProjects\PL8.TP8\Alunos2.txt"));//escrita num novo ficheiroStringtxt="";//atribuição do conteúdo do array dadosOrd a uma variavél Stringfor(inti=0;i<dadosOrd.length;i++){txt+=dadosOrd[i]+"\n";}fOUT.format(txt);//escrever no ficheiro essa variávelfOUT.close();//fechar ficheiro}}
Estanglement, eu olhei para a sua resolução, mas achei confuso pois ainda não aprende BufferedReader/Writer nem as instruções try&&finally.
Dá para me ajudar da forma que estou a tentar elaborar o exercício?
Obrigado
Abraço
N
noorders
viva…
alterei o método ordenar() para void e coloquei no main a fazer a listagem do vector dadosJuntos
importjava.io.File;importjava.io.FileNotFoundException;importjava.util.Formatter;importjava.util.Scanner;publicclassExParaResolver{staticfinalintMAX=100;//define a capacidade máxima dos vectores que eu entenderpublicstaticvoidmain(String[]args)throwsFileNotFoundException{ScannerfIN=newScanner(newFile("C:\Users\Ricardo Jorge\Documents\NetBeansProjects\PL8.TP8\Alunos.txt"));//leitura deste ficheiro já criadoFormatterout=newFormatter(System.out);String[]dados=newString[3];String[]dadosJuntos=newString[MAX];String[]dadosOrd=newString[MAX];Stringlinha,nome;intnum,idade,i=0;while(fIN.hasNext()){//ler o ficheirolinha=fIN.nextLine();//leitura linha a linhadados=linha.split("/");//usado para separar as Strings quando conhecemos o caracter.num=Integer.parseInt(dados[0]);nome=dados[1];idade=Integer.parseInt(dados[2]);dadosJuntos[i]=dados[0]+dados[1]+dados[2];i++;}if(fIN!=null){//fechar ficheiro após a leiturafIN.close();}ordenar(dadosJuntos);out.format("Conteúdo do vector dadosJuntos: ");//listagem do vector dadosJuntosfor(intj=0;j<dadosJuntos.length;j++){out.format(dadosJuntos[j]);}out.format("Conteúdo do novo ficheiro: ");for(intj=0;j<dadosOrd.length;j++){out.format(dadosOrd[i]);}escrever(dadosOrd);}/*Penso que estes são os métodos que tenho que usar/criar para a resolução do exercício: ler, ordenar, escrever, coordenar */privatestaticvoidordenar(String[]dadosOrd){Stringtexto1="",texto2="",txt_num1="",txt_num2="",a="";intn1,n2;for(inti=0;i<dadosOrd.length;i++){texto1=dadosOrd[i];for(intk=i+1;k<dadosOrd.length;k++){texto2=dadosOrd[k];for(intj=0;j<7;i++){txt_num1+=texto1.charAt(j);txt_num2+=texto2.charAt(j);}n1=Integer.valueOf(txt_num1).intValue();n2=Integer.valueOf(txt_num2).intValue();if(n1>n2){a=dadosOrd[k];dadosOrd[i]=dadosOrd[k];dadosOrd[k]=a;}a="";txt_num1="";txt_num2="";}}}privatestaticvoidescrever(String[]dadosOrd)throwsFileNotFoundException{//abrir o ficheiro alunos2.txt para escritaFormatterfOUT=newFormatter(newFile("C:\Users\Ricardo Jorge\Documents\NetBeansProjects\PL8.TP8\Alunos2.txt"));//escrita num novo ficheiroStringtxt="";//atribuição do conteúdo do array dadosOrd a uma variavél Stringfor(inti=0;i<dadosOrd.length;i++){txt+=dadosOrd[i]+"\n";}fOUT.format(txt);//escrever no ficheiro essa variávelfOUT.close();//fechar ficheiro}}
mas o programa gera-me estes erros e eu não sei como corrigir: