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