比较器正在从树形图中删除重复的对象

时间:2018-06-03 01:10:42

标签: java

我正在开发一个高分系统,它逐行从文件中读取并将所有行添加到树形图中,对树形图进行排序,并将分数和名称添加到新文件中,最高分位于顶部。

我已经关闭了系统,但由于某些未知原因,代码正在删除重复的条目,例如,我有3个分数。

1:桑德

1:桑德

2:马克

打印我的树形图如下所示:

enter image description here

我希望代码能够两次显示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);
}

2 个答案:

答案 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;
    }
}