1

重复行的打印次数应与它们在输入中出现的次数相同。需要特别注意,以使具有大量重复行的文件使用的内存不会超过唯一行数所需的内存。

我已经尝试了所有收集界面,但似乎没有一个适用于这个问题:(有人可以帮我吗??谢谢。

下面的代码内存效率低,因为它在 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--;


    }


}
4

2 回答 2

0

您正在寻找插入排序,这是一种在线算法,假设正在动态输入行,如果它是离线案例(未即时修改的文本文件),那么您可以使用任何排序算法,思考每一行作为一个字符串,完整的文件作为一个字符串数组。对数组进行排序,然后在打印时循环遍历它,然后打印出排序的行。

于 2013-09-20T05:18:24.863 回答
0

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

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

请注意,将Strings 放入池中可能会导致它们长时间停留,这可能会导致长时间运行的应用程序出现问题,因此您不想在生产应用程序中随便这样做,但对于您的家庭作业问题没关系. 在生产应用程序的情况下,您希望将Strings 放入 aSortedMap中,其中值是该行出现的次数,但正确编码更复杂。

于 2013-09-20T05:32:01.520 回答