[英]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.