BufferReader的高效实现

时间:2014-04-07 15:22:52

标签: java performance bufferedreader

我正在尝试用Java解决this问题,但它给了我一个错误。原因是我无法在运行时每秒处理处理2.5MB的输入数据。我想知道有没有办法加快我的代码?

public class Main {

    final static int size = 5000;
    static int[] result = new int[size];

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int n = input.nextInt();
        int k = input.nextInt();
        int divided = 0;

        BufferedReader bi = new BufferedReader(new InputStreamReader(System.in));

        try {
            while (n-- > 0) {

                result[n] = Integer.parseInt(bi.readLine());
                if (result[n] % k == 0)
                    divided++;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        System.out.println(divided);

        input.close();
    }

}

1 个答案:

答案 0 :(得分:1)

result数组有什么用途?您只是将其编入索引以存储刚刚解析的数字,然后立即再次检查其可分性。摆脱数组,然后做出循环:

while(n-- > 0)
    if (Integer.parseInt(bi.readLine()) % k == 0)
        divided++;

<小时/> 您可能希望在没有BufferedReader的情况下比较其性能,因为缓冲实际上可能会减慢它的速度。
就个人而言,我会使用Java 8 Streams API来执行此操作,因为很容易使其成为并行操作。像这样:

Scanner input = new Scanner(System.in);
final int n = input.nextInt(), k = input.nextInt();

InputStreamReader in = new InputStreamReader(System.in);

System.out.println(
        IntStream.generate(()->Integer.parseInt(in.readLine()))
                 .limit(n)
                 .parallel()
                 .filter(a->a%k==0)
                 .count());