可能有几种方法可以解决此任务:
- 应使用列表/数组的列表来存储一对输入行:
public static void reverseBlock(BufferedReader r, PrintWriter w) throws IOException {
List<List<String>> list = new ArrayList<>();
String line;
List<String> pair = new ArrayList<>();
while ((line = r.readLine()) != null) {
pair.add(line);
if (pair.size() == 2) {
list.add(pair);
pair = new ArrayList<>();
}
}
if (!pair.isEmpty()) { // check for an odd number of lines in the input
list.add(pair);
}
Collections.reverse(list);
for (List<String> p : list) {
for (String text : p) {
w.println(text);
}
}
}
- 使用方法
List::add(int index, E element)以适当的顺序插入行。
上面的方法太过分了,应该使用更简单的方法。
如果我们看一下初始数据的插入顺序,我们可以看到元素应该是这样插入的:
list.add(0, "cat"); // ["cat"]
list.add(1, "dog"); // ["cat", "dog"]
list.add(0, "bunny"); // ["bunny", "cat", "dog"]
list.add(1, "fish"); // ["bunny", "fish", "cat", "dog"]
...
所以整个方法可以改写为:
public static void reverseBlock(BufferedReader r, PrintWriter w) throws IOException {
List<String> list = new LinkedList<>();
String line;
while ((line = r.readLine()) != null) {
list.add(list.size() % 2, line);
}
for (String text : list) {
w.println(text);
}
}
这里list.size() % 2 提供了0, 1, 0, 1 的序列,没有额外的计数器/循环。另外,这里应该使用LinkedList,因为它在将元素插入到列表的头部时应该有更好的性能。