Java的輸入輸出
Java通過Scanner和BufferedReader可以實(shí)現(xiàn)對(duì)字符串型數(shù)據(jù)的輸入
實(shí)現(xiàn)思路:利用正則表達(dá)式驗(yàn)證其密碼的類型匹配腌且,然后逐個(gè)分析字符梗肝,進(jìn)行判斷。
本文主要是研究java中BufferedReader和Scanner兩種函數(shù)的效率
先奉上1081的解答源代碼
Scanner實(shí)現(xiàn)
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Patest_1081 {
public static void main(String[] args){
Scanner reader=new Scanner(System.in);
int n=reader.nextInt();
String str;
String pwVerify="^([0-9]|[A-Z]|[a-z]|[.]){6,80}";
Pattern pwPattern=Pattern.compile(pwVerify);
reader.nextLine();
for(int i=0;i<n;++i){
str=reader.nextLine();
if(str.length()<6){
System.out.println("Your password is tai duan le.");
continue;
}
Matcher pwMatch=pwPattern.matcher(str);
if(!pwMatch.matches()){
System.out.println("Your password is tai luan le.");
continue;
}
int countNum=0,countChar=0;
for(int k=0;k<str.length();++k){
if(str.charAt(k)>='0'&&str.charAt(k)<='9')countNum++;
if((str.charAt(k)>='a'&&str.charAt(k)<='z')||(str.charAt(k)>='A'&&str.charAt(k)<='Z'))countChar++;
if(countChar>0&&countNum>0){
System.out.println("Your password is wan mei.");
break;
}
}
if(countChar==0)System.out.println("Your password needs zi mu.");
if(countNum==0)System.out.println("Your password needs shu zi.");
}
}
}
PAT中Scanner實(shí)現(xiàn)的結(jié)果
圖片.png
BufferedReader實(shí)現(xiàn)
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Patest_1081_2 {
public static void main(String[] args)throws IOException {
BufferedReader buf=new BufferedReader(new InputStreamReader(System.in));
int n=Integer.parseInt(buf.readLine());
String str;
String pwVerify="^([0-9]|[A-Z]|[a-z]|[.]){6,80}";
Pattern pwPattern=Pattern.compile(pwVerify);
for(int i=0;i<n;++i){
str=buf.readLine();
if(str.length()<6){
System.out.println("Your password is tai duan le.");
continue;
}
Matcher pwMatch=pwPattern.matcher(str);
if(!pwMatch.matches()){
System.out.println("Your password is tai luan le.");
continue;
}
int countNum=0,countChar=0;
for(int k=0;k<str.length();++k){
if(str.charAt(k)>='0'&&str.charAt(k)<='9')countNum++;
if((str.charAt(k)>='a'&&str.charAt(k)<='z')||(str.charAt(k)>='A'&&str.charAt(k)<='Z'))countChar++;
if(countChar>0&&countNum>0){
System.out.println("Your password is wan mei.");
break;
}
}
if(countChar==0)System.out.println("Your password needs zi mu.");
if(countNum==0)System.out.println("Your password needs shu zi.");
}
}
}
PAT中BufferedReader實(shí)現(xiàn)的結(jié)果
圖片.png
??然后通過對(duì)比我們可以清楚的看到僅僅5組數(shù)據(jù)铺董,BufferedReader就已經(jīng)比Scanner展示出了更高的效率巫击。在諸如ACM等等算法的比賽當(dāng)中,對(duì)于運(yùn)行時(shí)間的要求極其苛刻精续,Java并沒有展示出對(duì)比C++/C語言的效率坝锰。但是,類似PAT給予了Java更寬松的時(shí)間規(guī)則重付,因此顷级,Java在一定程度上有比C++/C的一些優(yōu)勢(shì)。因此确垫,我們對(duì)Java中數(shù)據(jù)讀取的Scanner和BufferedReader進(jìn)行分析愕把。
??但是在多次提交中發(fā)現(xiàn),在PAT中由于計(jì)時(shí)規(guī)則的緣故森爽,導(dǎo)致每次提交的運(yùn)行時(shí)間都各不相同恨豁,因此決定利用編譯器對(duì)于其效率進(jìn)行一定的測(cè)試。因此我決定編寫簡(jiǎn)單的程序?qū)τ贘ava中Scanner和BufferedReader的效率做深度的測(cè)試爬迟。
首先我們利用Math.random()函數(shù)生成10000個(gè)隨機(jī)數(shù)當(dāng)做字符串
public class BufferedReader_vs_Scanner {
public static void main(String[] args)throws IOException {
for(int i=0;i<10000;++i){
System.out.println(Math.random()*1000);
}
}
}
然后將生成的結(jié)果放入一個(gè)word文檔中待用
圖片.png
如圖中所示橘蜜,我們已經(jīng)生成了10000個(gè)隨機(jī)數(shù)
然后編寫一個(gè)簡(jiǎn)單的讀取的BufferedReader和Scanner的程序
圖片.png