我有一个包含一些数据,数字和分数的文本文件,我需要按高分(10,9,8,7,6 ......)对这些数据进行排序
我该怎么做?
也许通过read和create ArrayList?或拆分
我不知道该怎么做
我需要按分数(2,2,1,0.8,...)
对此文本进行排序
saveButton = new JButton(" Save ");
saveButton.setBackground(Color.white);
saveButton.setForeground(Color.black);
saveButton.setFont(normalFont);
saveButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
PrintWriter writer = null;
String newLine = System.getProperty("line.separator");
String textFieldVal = textField.getText();
double Dsise = size;
double Dsec = sec;
double pt = (Dsise * Dsise) / Dsec;
DecimalFormat df = new DecimalFormat("#.####");
try {
writer = new PrintWriter(new BufferedWriter(new FileWriter("HighScores.txt", true)));
writer.println(textFieldVal + " (Time: " + sec + ", grid: " + size + "x" + size + ") " + "Score : " + df.format(pt));
writer.close();
} catch (IOException e1) {
e1.printStackTrace();
}
System.exit(0);
try {
Check();
} catch (IOException e1) {
e1.printStackTrace();
}
}
});
}
public void Check() throws IOException {
// here i need to sort it
}
}
here i have a text, what i need to sort
我尝试过扫描仪,但它不起作用
答案 0 :(得分:1)
目前尚不清楚您需要输出的内容,但您基本上有以下步骤:
逐行读取文件。您可以使用BufferedReader
或更现代的Java 8方法,获取Stream
Strings
,每个字符串代表一行。
Stream<String> lines = Files.lines(Paths.get(fileName));
将每个字符串翻译为您要保留的信息。你想要这个名字吗?你想得分吗?你想要所有的信息(时间,网格等)。如果您只需要得分,您可以找到字符串Score :
的索引,向其中添加8,并从那里获取字符串的子字符串,这将是您的分数,您可以将其转换为整数。获得数据后,您只需使用集合或流提供的排序机制之一对其进行排序。
List<Double> scores = lines
.map(line -> line.substring(line.indexOf("Score :") + 8))
.map(Double::parseDouble)
.sorted(Comparator.reverseOrder())
.collect(Collectors.toList());
如果您需要名称和其他详细信息,则必须创建一个包含数据(名称,时间等)的特定对象,而不是仅提取填充对象的分数。然后在得分属性上进行排序。从您的问题来看,目前尚不清楚这是否是您所需要的。
更新:根据评论,似乎实际上需要所有数据。
要保留所有数据,首先要创建一个代表文件中一行的对象。不幸的是,你的字符串并没有真正一致地格式化,如果值被分隔为:
,它会更容易Bogdan,2,2x2,2
Leo,6,2x2,0.6667
因此,如果您可以修改您在问题中粘贴的功能,以此格式输出,那么您就会更容易,因为您只需使用String.split(",")
。否则,您必须找到每个数据项的位置,indexOf()
和substring()
并将其解压缩。这是你的练习。
public class Player {
private final String name;
private final int time;
private final String grid;
private final double score;
public Player(String name, int time, String grid, double score) {
this.name = name;
this.time = time;
this.grid = grid;
this.score = score;
}
public double getScore() {
return score;
}
// todo: put all the getters
public static Player parse(String line) {
//todo: extract the data items from the string...
}
@Override
public String toString() {
return String.format("%s (Time: %d Grid: %s) Score: %.4f", name, time, grid, score);
}
}
然后您的流处理变得更简单:
List<Player> scores = lines
.map(Player::parse)
.sorted(Comparator.comparingDouble(Player::getScore).reversed())
.collect(Collectors.toList());