簡體   English   中英

如何對文本文件進行排序並使用Java保存?

[英]How to sort a text file and save it using java?

我被要求做一個測驗,在測驗的最后,我要保留的是兩個單獨的數組name []和scores []。 我被要求使用輸入和輸出將分數保存在文件中。 我已設法做所有事情並成功輸出結果並將其保存到文件中(例如highscores.txt)

結果保存如下:

4
name10
name5
name4
name2

第一行表示文件中有多少個分數,因為每個參加測驗的人都保存了分數。 我正在努力做的是按照最高到最低的順序對分數進行排序。

我已經嘗試過對分數進行排序,然后再將它們保存在文件中,但是文件中較舊的分數將不再進行排序。 例:

8 
newname10
newname9 
newname8
newname7
name10
name5
name4
name2

我只是一個初學者,所以請輕松...

您應該做的是創建實現Comparable<Person> class Person ,如果您有點懶並且數據量也不大,則可Serializable

然后將所有內容放入TreeSet<Person>並編寫一些方法來序列化TreeSet並反序列化它。

像這樣:

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.TreeSet;

public class Person implements Comparable<Person>, Serializable {
    private String name;
    private int score;

    public Person(String name, int score) {
        this.name = name;
        this.score = score;
        addPerson(this);
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getScore() {
        return score;
    }

    public void setScore(int score) {
        this.score = score;
    }

    @Override
    public int compareTo(Person o) {
        return score - o.score;
    }

    @Override
    public String toString() {
        return "Person [name=" + name + ", score=" + score + "]";
    }

    private static TreeSet<Person> classExtension = new TreeSet<Person>();

    private static void addPerson(Person person) {
        classExtension.add(person);
    }

    private static void removePerson(Person person) {
        classExtension.remove(person);
    }

    private static void showExtension() {
        for (Person person : classExtension)
            System.out.println(person);
    }

    public static void serialize() {

        FileOutputStream fos = null;
        ObjectOutputStream oos = null;

        try {
            fos = new FileOutputStream("Person.ser");
            oos = new ObjectOutputStream(fos);

            oos.writeObject(classExtension);

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {

            try {
                if (oos != null)
                    oos.close();
            } catch (IOException e) {
            }
            try {
                if (fos != null)
                    fos.close();
            } catch (IOException e) {
            }
        }
    }

    public static void deserialize(){

         FileInputStream fis = null;
         ObjectInputStream ois = null;
         try {
           fis = new FileInputStream("Person.ser"); 
           ois = new ObjectInputStream(fis); 

         classExtension =  (TreeSet<Person>) ois.readObject(); 

         } catch (FileNotFoundException e) {
           e.printStackTrace();
         } catch (IOException e) {
           e.printStackTrace();
         } catch (ClassNotFoundException e) {
           e.printStackTrace();
         } finally {
           // zasoby zwalniamy w finally
           try {
             if (ois != null) ois.close();
           } catch (IOException e) {}
           try {
             if (fis != null) fis.close();
           } catch (IOException e) {}
         }
    }

}

好吧,因為您沒有使用任何格式來輕松區分用戶名和得分(例如[username]:[score]),所以問題在於以后將這兩個信息彼此分開。

無論如何-您需要加載數據並對其重新排序,以嘗試將用戶名與樂譜分開。 閱讀文件行my並使用regexp(希望用戶名僅包含字母)從樂譜中拆分名稱: Pattern.compile("(\\w+)(\\d+)") 然后,您可以使用Matcher獲得組1(名稱)和組2(分數)。 然后您可以比較分數並重新排列列表

這個小程序應該可以完成任務。

請記住,這實際上只是對文本文件進行排序。 如果根據您的問題需要進一步處理,請對其進行修改。

public class LineReader {
    public static void main(String[] args) {
        String file = args[0];
        List<String> _list = new ArrayList<String>();
        try (BufferedReader br = new BufferedReader(new FileReader(file))) {
            for (String line; (line = br.readLine()) != null;) {
                _list.add(line);
            }
        } catch (Exception ex) {
        }
        java.util.Collections.sort(_list, String.CASE_INSENSITIVE_ORDER);
        try(FileWriter writer = new FileWriter(file)) {
            for (String str : _list) {
                writer.write(str + "\n");
            }
            writer.close();
        } catch (IOException ex) {
        }
    }
}

如果您已經能夠在將結果寫入文件之前對結果進行排序,那么為什么不在更新文件之前先讀取所有文件呢? 然后,您可以將存儲在數據結構中的舊數據與新數據放在一起,並將它們全部排序。 然后,您應該使用已有的數據覆蓋舊文件。

如果您的文件有很多記錄,這種方法可能會很昂貴。

最好的方法可能是使用使項目保持秩序的集合。 看一下PriorityQueue類。 然后只需將其存儲到文件中,然后在添加新元素之前加載它。 您可以使用ObjectOutputStream將PriorityQueue寫入文件,然后使用ObjectInputStream讀回該文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM