【问题标题】:Print even and odd lines from file从文件中打印偶数行和奇数行
【发布时间】:2013-09-22 04:19:38
【问题描述】:

我正在尝试从文件中读取,然后首先打印偶数元素,然后是奇数行。最好阅读这些行并将它们存储在一个列表中偶数和另一个奇数然后打印每个?或者有没有更有效的方法解决这个问题?

下面代码的 sn-p 是我进行这种排序的方法......到目前为止,它只是将输入存储到一个列表中并打印它们。有没有一种有效的方法来打印偶数行后跟奇数行?

public static void test(BufferedReader r, PrintWriter w) throws IOException {

    ArrayList<String> s = new ArrayList<String>();

    String line;
    int n = 0;
    while ((line = r.readLine()) != null) {
        s.add(line);
        n++;
    }
    Iterator<String> i = s.iterator();
    while (i.hasNext()) {
        w.println(i.next());
    }
}

提前感谢任何帮助/输入!

【问题讨论】:

    标签: java list sorting data-structures


    【解决方案1】:

    嗯,最好的办法是在读取偶数行时打印它们,并存储奇数行以供以后打印。

    ArrayList<String> s = new ArrayList<String>();
    
    String line;
    int n = 0;
    while ((line = r.readLine()) != null) {
        if(n % 2 == 0){
            s.add(line);
        }
        else{
            w.println(line);
        }
        n++;
    }
    Iterator<String> i = s.iterator();
    while (i.hasNext()) {
        w.println(i.next());
    }
    

    这将需要一半的空间。另一种选择可能是将奇数行打印到字符串,然后将该值打印到输出流 - 对于较短的输入可能更有效

    【讨论】:

    • 会先打印奇数吗?如果是这样,是否可以交换 if/else 以便首先打印偶数行?
    • 这取决于你所说的“奇数”是什么意思,它将第 0 行添加到数组中,并打印第 1 行,就实际文件而言,这意味着存储奇数行并打印偶数行编号的行。碰巧我们是从索引 0 开始,而不是 1。但是,交换 if 条件(或执行 %2 == 1)会产生相反的效果。
    【解决方案2】:

    您可以按如下方式更改循环:

    while (i.hasNext()) {
        String odd = i.next();
        if (i.hasNext()) {
            String even = i.next();
            w.println(even);
            w.println(odd);
        } else {
            w.println(odd);
        }
    }
    

    【讨论】:

      【解决方案3】:

      对于小文件,您正在做的事情很好 - 只需遍历您的列表两次,打印交替行,第一次是偶数,第二次是赔率。

      对于大文件,读取文件两次并像以前一样打印交替行。什么是大文件?这取决于系统。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-14
        • 2013-11-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多