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

标签 java performance sorting collections space-efficiency

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

我已经尝试了所有的集合接口(interface),但似乎没有一个可以解决这个问题:( 有人可以帮帮我吗?? 谢谢。

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


    }


}

最佳答案

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

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

请注意,将 String 放入池中可能会导致它们停留很长时间,这可能会导致长时间运行的应用程序出现问题,因此您不想在一个生产应用程序,但对于你的家庭作业问题来说这没问题。在生产应用程序的情况下,您希望将 String 放入 SortedMap 中,其中值是该行出现的次数,但这更多正确编码很复杂。

关于java - 如何读取输入的每一行并按排序顺序输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18909249/

相关文章:

java - Spring MVC 基于注释的配置不起作用

c# - 归档文件时加快处理时间

javascript - 将图像存储在高速缓存中

c# - 比 Dictionary<Type, X> 更快的选择?

python - 从python中的特定索引值排序列表

c++ - 可以仅使用 std::sort() 将零移动到数组的末尾吗?

algorithm - 改进查找数组中的最小值和最大值

java - 添加到 ArrayList 中已有的 Integer

java - Java中的JTable TableModel问题

java - 生成自定义记录器