Java String IO

作者: gattonero | 来源:发表于2018-12-11 16:11 被阅读0次

    问题:

    判断给定的n个输入中,能被m整除的数字的数量

    输入

    7 3
    1
    51
    966369
    7
    9
    999996
    11
    

    输出

    4
    

    解决:

    Scanner

    使用指定的输入流创建Scanner,使用内置的nextInt,nextLong等方法读取基本类型的值,其内部通过正则表达式来读取不同的类型,速度慢

    Scanner s = new Scanner(System.in); 
    int n = s.nextInt(); 
    int k = s.nextInt(); 
    int count = 0; 
    while (n-- > 0) 
    { 
        int x = s.nextInt(); 
        if (x%k == 0) 
           count++; 
    }  
    System.out.println(count); 
    

    特别需要注意的是,Scanner的nextLine方法是读取当前输入流中剩余部分一直到换行符之间的字符串,返回值中再把换行符扔掉,但nextInt等方法会无视所有换行符,读取所需的字符串(也就是不一定会读换行符)

    Scanner s = new Scanner(System.in);
    int first = s.nextInt();
    int second = Integer.parseInt(s.nextLine());
    
    System.out.println(first+" "+second);
    

    对于输入

    1
    2
    

    这段代码并不会输出

    1 2
    

    相反,会抛出一个异常:

    Exception in thread "main" java.lang.NumberFormatException: For input string: ""
    

    因为nextLine实际上只读了一个换行符,这种问题处理起来很简单,但实际上仍然会一不小心遇到,所以尽量就少用Scanner(根源其实在于nextLine是按行解析,而nextXXX方法是按正则匹配的,不要混用)

    BufferedReader

    从字符流中读取字符,缓存字符并提供对字符,数组和行的高效读取。快速,但相对繁琐,需要手动转换数据类型

    BufferedReader br = new BufferedReader( 
                          new InputStreamReader(System.in)); 
    //先读取行,再用StringTokenizer读取每个token
    StringTokenizer st = new StringTokenizer(br.readLine()); 
    int n = Integer.parseInt(st.nextToken()); 
    int k = Integer.parseInt(st.nextToken()); 
    int count = 0; 
    while (n-- > 0) 
    { 
        int x = Integer.parseInt(br.readLine()); 
        if (x%k == 0) 
           count++; 
    } 
    System.out.println(count); 
    

    Tips

    • BufferedReader是线程同步的,而Scanner不是
    • BufferedReader顾名思义,能够缓存的字符(8KB缓存区)大于Scanner(1KB缓存区)
    • BufferedReader比Scanner快的原因是它把输入流原样输出,而Scanner则做了处理

    https://www.geeksforgeeks.org/difference-between-scanner-and-bufferreader-class-in-java/
    https://www.geeksforgeeks.org/fast-io-in-java-in-competitive-programming/

    相关文章

      网友评论

        本文标题:Java String IO

        本文链接:https://www.haomeiwen.com/subject/bgfehqtx.html