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:
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Formatter;
import java.util.Scanner;
public class ExParaResolver {
static final int MAX = 100;//define a capacidade máxima dos vectores que eu entender
public static void main(String[] args) throws FileNotFoundException {
Scanner input = new Scanner(new File("Alunos.txt"));//leitura deste ficheiro já criado
Formatter output = new Formatter(new File("Alunos2.txt"));//escrita num novo ficheiro
String []dados=new String[3];
String linha, nome;
int num, idade;
while (input.hasNext()) {//ler o ficheiro
linha=input.nextLine();//leitura linha a linha
dados = 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 leitura
input.close();
}
output.close();
}
public static void ordenarFich(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
Um abraço
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.
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
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.
package guj;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.SortedSet;
import java.util.TreeSet;
public class ExemploOrdenarArquivo {
/**
* 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
*/
public void ordenar (File arqEntrada, File arqSaida) throws IOException {
BufferedReader br = null;
BufferedWriter bw = null;
// Contém as linhas ordenadas, sem duplicação
SortedSet<String> linhasOrdenadas = new TreeSet<String>();
// Lê as linhas do arquivo de entrada
try {
br = new BufferedReader (new FileReader (arqEntrada));
for (String linha = 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 (IOException ex) { }
}
String lineSeparator = System.getProperty ("line.separator");
// Grava as linhas do arquivo de saída
try {
bw = new BufferedWriter (new FileWriter (arqSaida));
// Forma de percorrer linhasOrdenadas de forma ordenada.
for (String linha : linhasOrdenadas) {
bw.write(linha); bw.write(lineSeparator);
}
} finally {
if (bw != null) try { bw.close(); } catch (IOException ex) { }
}
}
/**
* Exemplo: java -cp . ExemploOrdenarArquivo arquivoEntrada.txt arquivoSaida.txt
* @param args
*/
public static void main(String[] args) throws IOException {
if (args.length != 2) {
System.err.println ("Sintaxe: java -cp . ExemploOrdenarArquivo arquivoEntrada.txt arquivoSaida.txt");
System.exit (1);
}
new ExemploOrdenarArquivo().ordenar (new File (args[0]), new File (args[1]));
}
}
Olá.
Antes de mais peço desculpa pelo atraso.
Eu tentei resolver desta forma:
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Formatter;
import java.util.Scanner;
public class ExParaResolver {
static final int MAX = 100;//define a capacidade máxima dos vectores que eu entender
public static void main(String[] args) throws FileNotFoundException {
Scanner fIN = new Scanner(new File("C:\Users\Ricardo Jorge\Documents\NetBeansProjects\PL8.TP8\Alunos.txt"));//leitura deste ficheiro já criado
Formatter out = new Formatter(System.out);
String[] dados = new String[3];
String[] dadosJuntos = new String[MAX];
String[] dadosOrd = new String[MAX];
String linha, nome;
int num, idade, i = 0;
while (fIN.hasNext()) {//ler o ficheiro
linha = fIN.nextLine();//leitura linha a linha
dados = 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 leitura
fIN.close();
}
out.format("Conteúdo do vector dadosJuntos: ");
for (int j = 0; j < dadosJuntos.length; j++) {
out.format(dadosJuntos[j]);
}
dadosOrd[MAX] = ordenar(dadosJuntos);
out.format("Conteúdo do novo ficheiro: ");
for (int j = 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
*/
private static String ordenar(String[] dadosOrd) {
String texto1 = "", texto2 = "", txt_num1 = "", txt_num2 = "", a = "";
int n1, n2;
for (int i = 0; i < dadosOrd.length; i++) {
texto1 = dadosOrd[i];
for (int k = i + 1; k < dadosOrd.length; k++) {
texto2 = dadosOrd[k];
for (int j = 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 = "";
}
}
return dadosOrd[MAX];
}
private static void escrever(String[] dadosOrd) throws FileNotFoundException {
//abrir o ficheiro alunos2.txt para escrita
Formatter fOUT = new Formatter(new File("C:\Users\Ricardo Jorge\Documents\NetBeansProjects\PL8.TP8\Alunos2.txt"));//escrita num novo ficheiro
String txt = "";
//atribuição do conteúdo do array dadosOrd a uma variavél String
for (int i = 0; i < dadosOrd.length; i++) {
txt += dadosOrd[i] + "\n";
}
fOUT.format(txt);//escrever no ficheiro essa variável
fOUT.close();//fechar ficheiro
}
}
Mas tenho este erro chato:
[list]
run:
Exception in thread “main” java.lang.NullPointerException
Conteúdo do vector dadosJuntos: at java.util.regex.Matcher.getTextLength(Matcher.java:1140)
at java.util.regex.Matcher.reset(Matcher.java:291)
at java.util.regex.Matcher.(Matcher.java:211)
at java.util.regex.Pattern.matcher(Pattern.java:888)
at java.util.Formatter.parse(Formatter.java:2458)
at java.util.Formatter.format(Formatter.java:2414)
at java.util.Formatter.format(Formatter.java:2367)
at ExParaResolver.main(ExParaResolver.java:34)
Java Result: 1
BUILD SUCCESSFUL (total time: 0 seconds)
[/list]
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
viva…
alterei o método ordenar() para void e coloquei no main a fazer a listagem do vector dadosJuntos
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Formatter;
import java.util.Scanner;
public class ExParaResolver {
static final int MAX = 100;//define a capacidade máxima dos vectores que eu entender
public static void main(String[] args) throws FileNotFoundException {
Scanner fIN = new Scanner(new File("C:\Users\Ricardo Jorge\Documents\NetBeansProjects\PL8.TP8\Alunos.txt"));//leitura deste ficheiro já criado
Formatter out = new Formatter(System.out);
String[] dados = new String[3];
String[] dadosJuntos = new String[MAX];
String[] dadosOrd = new String[MAX];
String linha, nome;
int num, idade, i = 0;
while (fIN.hasNext()) {//ler o ficheiro
linha = fIN.nextLine();//leitura linha a linha
dados = 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 leitura
fIN.close();
}
ordenar(dadosJuntos);
out.format("Conteúdo do vector dadosJuntos: ");//listagem do vector dadosJuntos
for (int j = 0; j < dadosJuntos.length; j++) {
out.format(dadosJuntos[j]);
}
out.format("Conteúdo do novo ficheiro: ");
for (int j = 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
*/
private static void ordenar(String[] dadosOrd) {
String texto1 = "", texto2 = "", txt_num1 = "", txt_num2 = "", a = "";
int n1, n2;
for (int i = 0; i < dadosOrd.length; i++) {
texto1 = dadosOrd[i];
for (int k = i + 1; k < dadosOrd.length; k++) {
texto2 = dadosOrd[k];
for (int j = 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 = "";
}
}
}
private static void escrever(String[] dadosOrd) throws FileNotFoundException {
//abrir o ficheiro alunos2.txt para escrita
Formatter fOUT = new Formatter(new File("C:\Users\Ricardo Jorge\Documents\NetBeansProjects\PL8.TP8\Alunos2.txt"));//escrita num novo ficheiro
String txt = "";
//atribuição do conteúdo do array dadosOrd a uma variavél String
for (int i = 0; i < dadosOrd.length; i++) {
txt += dadosOrd[i] + "\n";
}
fOUT.format(txt);//escrever no ficheiro essa variável
fOUT.close();//fechar ficheiro
}
}
mas o programa gera-me estes erros e eu não sei como corrigir:
[list]
run:
Exception in thread “main” java.lang.NullPointerException
at ExParaResolver.ordenar(ExParaResolver.java:55)
at ExParaResolver.main(ExParaResolver.java:32)
Java Result: 1
BUILD SUCCESSFUL (total time: 0 seconds)
[/list]
Se alguém poder ajudar aqui fica um muito obrigado 
Abraço