【问题标题】:Java - Saving 2 consecutive lines in blocks and output in opposite orderJava - 在块中保存 2 个连续的行并以相反的顺序输出
【发布时间】:2021-11-17 01:01:41
【问题描述】:

我试图将每 2 行连续的输入存储到一个“块”中,并以相反的顺序输出行的“块”,但按照它们被读取的顺序。

输入:

cat

dog

bunny

fish

输出:

bunny

fish

cat

dog

我尝试使用ArrayList 来存储这些行

【问题讨论】:

  • 欢迎来到 SO,也许如果您告诉我们您正在努力解决的问题的哪一部分,以及您尝试解决的问题,我们可能会更好地提供帮助 :)。在第一次通过时,我建议您需要弄清楚您需要采取哪些步骤,先尝试在纸上解决?

标签: java list arraylist collections reverse


【解决方案1】:

可能有几种方法可以解决此任务:

  1. 应使用列表/数组的列表来存储一对输入行:
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);
        }
    }
}
  1. 使用方法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,因为它在将元素插入到列表的头部时应该有更好的性能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-07
    • 2018-06-24
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 2022-11-28
    相关资源
    最近更新 更多