Ordenar conteúdo de um ficheiro por ordem crescente (números inteiros)

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

Abraço