重复行的打印次数应与其在输入中出现的次数相同。需要特别注意,以便具有大量重复行的文件使用的内存不会超过唯一行数所需的内存。
我已经尝试了所有的集合接口(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/