如何读取输入的每一行并按排序顺序输出?

时间:2013-09-20 05:12:03

标签: java performance sorting collections space-efficiency

重复行的打印次数应与输入中出现的次数相同。需要特别小心,以便具有大量重复行的文件不会使用比唯一行数所需的内存更多的内存。

我已经尝试了所有的收集界面,但似乎没有人为这个问题工作:( 有人可以帮帮我吗?? 感谢。

下面的代码是内存效率低下的,因为它在PriorityQueue中存储重复的行。希望这有帮助

public static void doIt(BufferedReader r, PrintWriter w) throws IOException {
    PriorityQueue<String> s=new PriorityQueue<String>();


    String   line;
    int n=0;
    while ((line = r.readLine()) != null) {


        s.add(line);
        n++;

    while (n!=0) {
        w.println(s.remove());
        n--;


    }


}

2 个答案:

答案 0 :(得分:0)

你正在寻找插入排序,这是一个在线算法,假设线路正在即时输入,如果它是一个离线情况(文本文件没有被动态修改),你可以使用任何排序算法,将每一行视为一个String,将完整文件视为一个字符串数组。对数组进行排序,然后在打印时循环遍历它,然后打印出已排序的行。

答案 1 :(得分:0)

理想的方法是使用排序的多重集,例如Guava的TreeMultiset

如果您不允许使用外部库,则可以将s.add(line)替换为s.add(line.intern())。这告诉JVM将每个唯一line的副本放入String池中,并在所有引用中共享相同的对象。

请注意,将String放入池可能会导致它们长时间停留,这可能会导致长时间运行的应用程序出现问题,因此您不希望在生产应用程序中随意执行此操作,但对于你的作业问题,没关系。对于生产应用程序,您需要将String放入SortedMap,其中值是该行出现的次数,但正确编码会更复杂。 / p>