scanner用法_Java参赛技巧1:用BufferedReader代替Scanner提高输入效率

用竞赛在线评判系统(OJ)编程时,如果要从标准输入(System.in)读入的数据量非常大,使用Scanner类虽然简单,但效率可能偏低,因而可能导致程序超时或内存占用过大。此时可以尝试改用带缓冲的BufferedReader类读取数据以提高效率,而且数据量越大,差异越明显。

BufferedReader的readLine()方法和Scanner的nextLine()方法用法类似,都是读取并返回一行String类型字符串,以回车做结束符。当需要从一行字符串中提取基本类型数据时,例如以空格分隔的数组元素,可以先用String类的split(" ")方法将字符串分割成子串数组,再用包装类Integer(或Double)的parseInt()(或parseDouble())方法将每个子串解析为基本类型数据。

需要注意的是,使用字符流BufferedReader从字节流System.in读取数据时,需要先用System.in做参数创建转换流InputStreamReader对象(从字节到字符的桥梁),再用此对象做参数创建BufferedReader对象。

以下程序从键盘读取并显示一个200*200的整数数组,每个数介于0~10000之间。用OJ系统(来自http://www.educg.net/index.html)录入相同的数据,分别测试使用Scanner和BufferedReader两个类时程序运行时间和占用内存的差异。

import java.util.Scanner;

import java.io.*;

public class InputTest {

    /**

     * Used to randomly generate an m*n array for test

     */

    public static void generate(int m, int n) {

        int[][] array = new int[m][n];

        int i, j;

        for (i = 0; i < m; ++i) {

            for (j = 0; j < n; ++j) {

                array[i][j] = (int) (Math.random() * 10000);

            }

        }

        printArray(array);

    }

    public static int[][] TestScanner(int m, int n) {

        Scanner scan = new Scanner(System.in);

        String input, s[];

        int[][] array = new int[m][n];

        int i, j;

        for (i = 0; i < m; ++i) {

            input = scan.nextLine();

            s = input.split(" ");   //split string

            for (j = 0; j < n; ++j) {

                array[i][j] = Integer.parseInt(s[j]);

            }

        }

        return array;

    }

    public static int[][] TestBufferedReader(int m, int n) throws IOException {

        String input, s[];

        int[][] array = new int[m][n];

        int i, j;

        InputStreamReader isr = new InputStreamReader(System.in);

        BufferedReader br = new BufferedReader(isr);

        for (i = 0; i < m; ++i) {

            input = br.readLine();

            s = input.split(" ");   //split string

            for (j = 0; j < n; ++j) {

                array[i][j] = Integer.parseInt(s[j]);

            }

        }

        br.close();

        return array;

    }

    public static void printArray(int[][] array) {

        int i, j;

        for (i = 0; i < array.length; ++i) {

            for (j = 0; j < array[i].length; ++j) {

                System.out.print(array[i][j] + " ");

            }

            System.out.println();

        }

    }

    /**

     * @param args the command line arguments

     */

    public static void main(String[] args) throws IOException {

        //generate(200,200);

        int option = 0;   //0: Scanner; 1: BufferedReader

        int m = 200,n = 200;

        int[][] array;

        switch (option) {

            case 0:

                array = TestScanner(m, n);

                break;

            default:

                array = TestBufferedReader(m, n);

                break;

        }

        printArray(array);

    }

}

当option = 0时,使用Scanner的测试结果:

                                               c8a95c98c66f7cc532866f441202702b.png

当option = 1时,使用BufferedReader的测试结果:

bdfef378ba415387934b6751182ea1be.png

多次测试结果表明,数据量较大时,BufferedReader比Scanner读取数据的效率更高。但因为使用BufferedReader涉及异常处理以及多个输入流的创建和套接,内存开销未必会比Scanner更小。

bfe3b9ee88a8743f724af0c0151f5e7b.png

d8562b5bf3d5dd8969ca1938ca9ad775.png 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值