如何从文件中使用名称对我的高分列表进行排序?-java

时间:2014-04-29 01:26:38

标签: java sorting scoring

我试图在java中为我的蛇游戏排序我的高分:我希望能够从文件中对它们进行排序。

该文件的一个例子是:

  1. George:200
  2. 莎拉:700
  3. Ben:100
  4. 弗雷德:400
  5. AJ:300
  6. 我怎样才能对名称进行排序,以及所有名称:

    1. 莎拉:700
    2. 弗雷德:400
    3. AJ:300
    4. George:200
    5. Ben:100
    6. 如果您可以解释如何操作,请先发送一些代码,如果您之前已经完成,或者发送给我的链接解释得很好,那就太棒了!感谢

2 个答案:

答案 0 :(得分:0)

你需要一个最大堆

  1. 逐行读取文件中的所有值。读取时使用拆分功能拆分:。这会给你一个名字,然后是分数。创建一个id为score的对象,value为包含score和name的对象。 (你需要考虑相同的分数)。

    String [] values = input.split(" :); String name = values [0]; 字符串得分=值[1];

  2. 创建最大堆并将元素逐个插入堆中。 - 在java中,您可以将PriorityQueue对象用于此数据结构

  3. 完成后,请逐个弹出元素。这将按降序为您提供所有元素。由于您的对象包含得分和名称,因此您可以使用它以降序打印结果

  4. 使用"民意调查" PriorityQueue的方法来实现这个

    http://docs.oracle.com/javase/7/docs/api/java/util/PriorityQueue.html

答案 1 :(得分:-1)

正如我的评论所述:

逐行读取输入文件,将正则表达式匹配的值存储到TreeMap(已排序的HashMap,在这种情况下反向排序),然后以正确的顺序将这些值写回文件。 / p>

输入:" scores.txt":

1.  George : 200
2.  Sarah : 700
3.  Ben : 100
4.  Fred : 400
5.  AJ : 300

输出:

1.  Sarah : 700
2.  Fred : 400
3.  AJ : 300
4.  George : 200
5.  Ben : 100

import java.util.*;
import java.util.regex.*;
import java.io.*;

public class regex {
    public static void main(String args[]) throws java.io.IOException {       
        File file = new File("scores.txt");
        Scanner scan = new Scanner(file);

        //create a TreeMap in reverse order otherwise it will sort ascending instead of descending
        Map<Integer, String> map = new TreeMap<Integer, String>(Collections.reverseOrder());

        String regexp = "\\d*\\.\\s*([a-zA-Z]*)\\s*\\:\\s*(\\d*)";
        Pattern pattern = Pattern.compile(regexp);

        while(scan.hasNextLine()) {
            Matcher match = pattern.matcher(scan.nextLine());
            while (match.find()) {  
                //insert into the map the score : name --->  (\\d*) : ([a-zA-Z]*)
                map.put(Integer.parseInt(match.group(2)), match.group(1));
            }
        }

        BufferedWriter bw = new BufferedWriter(new FileWriter(file));

        int count = 1;
        for (Map.Entry entry : map.entrySet()) {
            //writes ->       1. George : 100 \n
            bw.write(count + ".  " + entry.getValue() + " : " + entry.getKey() + "\n");
            count++;
        }   

        bw.close();
    }
}