我正在开发一个高分系统,它逐行从文件中读取并将所有行添加到树形图中,对树形图进行排序,并将分数和名称添加到新文件中,最高分位于顶部。
我已经关闭了系统,但由于某些未知原因,代码正在删除重复的条目,例如,我有3个分数。
1:桑德
1:桑德
2:马克
打印我的树形图如下所示:
我希望代码能够两次显示Sander。
我已经被困了很长时间并且会提供一些帮助,这是我的代码:
public void sortScores() throws IOException {
File input = new File("scores.txt");
File output = new File("outputscores.txt");
FileInputStream fis = new FileInputStream(input);
FileOutputStream fos = new FileOutputStream(output);
BufferedReader in = new BufferedReader(new InputStreamReader(fis));
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(fos));
String aLine;
while ((aLine = in.readLine()) != null) {
String[] scoreAndName = aLine.split(" : ");
int score1 = Integer.parseInt(scoreAndName[0]);
String name1 = scoreAndName[1];
unsortMap1.put(score1, name1);
}
Map<Integer, String> treeMap = new TreeMap<Integer, String>(
new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
if (o1 >= o2) {
return -1;
} else {
return 1;
}
}
});
treeMap.putAll(unsortMap1);
System.out.println(treeMap);
}
答案 0 :(得分:0)
您选择了错误的集合类型。
Map<Integer, String>
只会为任何可能的String
存储一个Integer
值。因此,给定分数(例如1
),它可以存储单个名称。多次不同名。
您似乎正在尝试对表示分数的记录进行排序。为此,您需要创建一个自定义类,其实例代表记录。
您可以通过多种方式对记录进行排序:
使用Arrays.sort
将它们放入列表并使用Collections.sort
实施您自己的排序算法。 (不推荐。最好不要浪费你的时间&#34;重新发明轮子&#34;。)
您需要实现Comparator
来订购记录 1 ,或者让您的记录类实现Comparable
。
有关详细信息,请阅读相应的javadoc。
但
您的记录不是唯一的,这些数据结构将删除重复项 2 。 1 - 从Java 8开始,TreeMap
接口有一些用于创建比较器的静态辅助方法;例如TreeSet
。
2 - 严格来说并非如此。如果您的记录包含第3个字段,您可以执行此操作,该字段包含您在比较器中用作平局的唯一标识符。或者您可以使用Map
,其中整数表示&#34;等于&#34;的记录数。
答案 1 :(得分:0)
这正是Map应该工作的方式。来自documentation:
将键映射到值的对象。地图不能包含重复的键;每个键最多可以映射一个值。
put(key, value)
将旧值替换为新值。
虽然您可以使用Map<Integer, List<String>>
(例如)使其工作,但这很麻烦且看起来不干净。 List是此任务的更好数据结构。
我会定义一个类Score,使用它来填充列表,并使用自定义比较器对其进行排序。您还可以使用Score实现Comparable而不是使用Comparator。
以下是使用Comparator.comparingInt()的示例。
List<Score> scores = new ArrayList<>();
scores.add(new Score(1, "Name")); //adding an element
scores.sort(Comparator.comparingInt(Score::getScore)); //sorting
class Score {
private final int score;
private final String name;
Score(int score, String name) {
this.score = score;
this.name = name;
}
public int getScore() {
return score;
}
public String getName() {
return name;
}
}