What's the fastest way to read from System.in in Java?

前端 未结 9 2089
梦如初夏
梦如初夏 2020-11-30 19:17

I am reading bunch of integers separated by space or newlines from the standard in using Scanner(System.in).

Is there any faster way of doing this in Ja

相关标签:
9条回答
  • 2020-11-30 20:08

    Reading from disk, again and again, makes the Scanner slow. I like to use the combination of BufferedReader and Scanner to get the best of both worlds. i.e. speed of BufferredReader and rich and easy API of the scanner.

    Scanner scanner = new Scanner(new BufferedReader(new InputStreamReader(System.in)));
    
    0 讨论(0)
  • 2020-11-30 20:09

    You can use BufferedReader for reading data

    BufferedReader inp = new BufferedReader(new InputStreamReader(System.in));
      int t = Integer.parseInt(inp.readLine());
      while(t-->0){
        int n = Integer.parseInt(inp.readLine());
        int[] arr = new int[n];
        String line = inp.readLine();
        String[] str = line.trim().split("\\s+");
        for(int i=0;i<n;i++){
          arr[i] = Integer.parseInt(str[i]);
        }
    

    And for printing use StringBuffer

        StringBuffer sb = new StringBuffer();
        for(int i=0;i<n;i++){
                  sb.append(arr[i]+" "); 
                }
        System.out.println(sb);
    
    0 讨论(0)
  • 2020-11-30 20:10

    You can read from System.in in a digit by digit way. Look at this answer: https://stackoverflow.com/a/2698772/3307066.

    I copy the code here (barely modified). Basically, it reads integers, separated by anything that is not a digit. (Credits to the original author.)

    private static int readInt() throws IOException {
        int ret = 0;
        boolean dig = false;
        for (int c = 0; (c = System.in.read()) != -1; ) {
            if (c >= '0' && c <= '9') {
                dig = true;
                ret = ret * 10 + c - '0';
            } else if (dig) break;
        }
        return ret;
    }
    

    In my problem, this code was approx. 2 times faster than using StringTokenizer, which was already faster than String.split(" "). (The problem involved reading 1 million integers of up to 1 million each.)

    0 讨论(0)
提交回复
热议问题