如何使用Java按最高编号对文本文件进行排序

时间:2013-06-07 16:53:17

标签: java sorting

我目前遇到一个小问题,我正在用Java制作游戏,而且我正在为它做一个高分。我将播放器的名称和乐谱保存到文本文件中。当我尝试将其打印出来时,它显然按照文本文件的顺序显示,我将如何对其进行排序,以便首先使用最高分。

文本文件中的示例:

John: 12
Bert: 16
Oscar: 18
Eric: 25
Carl: 9

我多么想要:

Eric: 25
Oscar: 18
Bert: 16
John: 12
Carl: 9

3 个答案:

答案 0 :(得分:1)

尝试使用排序Collections.sort(list);

答案 1 :(得分:1)

使用像TreeMap这样的有序集合,它按照键的自然顺序保存其条目(键值映射)。因为,您希望对高分进行排序,将分数作为键和玩家名称作为其值。

// instantiate your sorted collection
Map<Integer, String> highestScores = new TreeMap<Integer, String>();

// setup a file reader
BufferedReader reader = new BufferedReader(
                        new FileReader(new File("/path/to/file")));

String line = null;
while ((line = reader.readLine()) != null) { // read your file line by line
    String[] playerScores = line.split(": ");
    // populate your collection with score-player mappings
    highestScores.put(Integer.valueOf(playerScores[1]), playerScores[0]);
}

// iterate in descending order
for (Integer score : highestScores.descendingKeySet()) {
    System.out.println(highestScores.get(score) + ": " + score);
}

输出

Eric: 25
Oscar: 18
Bert: 16
John: 12
Carl: 9

修改
两个或更多玩家很可能拥有相同的高分。因此,排序后的集合必须更加复杂,但如果您已经理解了上面的那个,那么理解这个集合就不会有麻烦了。

现在我们不得不将得分映射到玩家,我们必须将其映射到List个玩家(具有相同的高分):

// {key - value} = {high score - {list, of, players}}
TreeMap<Integer, List<String>> highestScores =
                               new TreeMap<Integer, List<String>>();

BufferedReader reader = new BufferedReader(
                        new FileReader(new File("/path/to/file")));

String line = null;
while ((line = reader.readLine()) != null) {
    String[] playerScores = line.split(": ");
    Integer score = Integer.valueOf(playerScores[1]);
    List<String> playerList = null;

    // check if a player with this score already exists
    if ((playerList = highestScores.get(score)) == null) { // if NOT,
        playerList = new ArrayList<String>(1); // CREATE a new list
        playerList.add(playerScores[0]);
        highestScores.put(Integer.valueOf(playerScores[1]), playerList);
    } else { // if YES, ADD to the existing list
        playerList.add(playerScores[0]);
    }
}

// iterate in descending order
for (Integer score : highestScores.descendingKeySet()) {
    for (String player : highestScores.get(score)) { // iterate over player list
        System.out.println(player + ": " + score);
    }
}

输出

Eric: 25
Oscar: 18
Bert: 16
John: 12 *
Jane: 12 *
Carl: 9

答案 2 :(得分:0)

有多种方法可以实现这一点。您可以查看this link以获取有关如何使用Java对多个内容进行排序的帮助。