输入
scanner类
我,一java菜鸡,昨天刷题,发现一直MLE,以为可能是java本来的弊端,比其他的内存要的多,起初以为是long数组太大,改为int仍不行,后来才了解到是输入的问题。 拿来主义,直接拿来用好吗。根据数据多少,快慢选择。 由慢到快。
import java.util.Scanner;
public class Tian {
public static void main(String[]args){
Scanner scan = new Scanner(System.in);
String c1 = scan.next();
System.out.println(c1);
String c = scan.nextLine();
String c2 = scan.nextLine();
System.out.println(c2);
int c3 = scan.nextInt();
System.out.println(c3);
}
}
next和nextLine同时用要注意next的结束符(换行)是可以存入nextLine里的,所以像C++,getchar一样,加一个nextline来存入不需要的换行。 next():
1、一定要读取到有效字符后才可以结束输入。 2、对输入有效字符之前遇到的空白,next() 方法会自动将其去掉。 3、只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符。换行也可作为结束符。 next() 不能得到带有空格的字符串。
nextLine():
1、以Enter为结束符,也就是说 nextLine()方法返回的是输入回车之前的所有字符。 2、可以获得空白,同样输入是换行,同样可以存入。
BufferedReader类
- BufferedReader:把 System.in 包装在一个 BufferedReader 对象中来创建一个字符流:速度中
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Tian {
public static void main(String[]args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
char c = (char) br.read();
String c1 = br.readLine();
String mid = br.readLine();
System.out.println(c);
System.out.println(mid);
}
}
两个注意点 1.要有异常处理:throw IOException 2.read和readLine同时使用和上文next和nextLine注意点一样。
StreamTokenized类
- StreamTokenized:不多介绍,因为我也只会用:速度:快
详细解说: link.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
public class Tian {
public static void main(String[]args) throws IOException {
StreamTokenizer st = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
st.nextToken();
int n = (int) st.nval;
st.nextToken();
String c = st.sval;
System.out.println(n);
System.out.println(c);
}
}
输出
小数输出
保留几位小数输出,两种
-用DecimalFormat类输出
DecimalFormat df = new DecimalFormat("0.00");
System.out.println(df.format(r));
System.out.printf("%.2f",2.00);
正常输出:
int a[] = {1,2,3};
for(int e:a){
e += 1;
System.out.print(e + " ");
}
System.out.println();
for(int i = 0;i < 3;i++){
System.out.print(a[i] + " ");
}
System.out.println();
输出流
说来就来,昨天输入流MLE,今天输出流MLE外加TLE,卡死的题目:link.(用java写出来,call me,谢谢) 俺查了老半天就查到四种输出。
- BufferedWrite
- PrintStream
- PrintWrite
- System.out
各种褒贬不一,干脆,直接测一测 测量时间:long star1 = System.nanoTime();
import java.io.*;
import java.util.Scanner;
public class Main {
public static void main(String[]args) throws IOException {
String c = "abcdef";
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out));
PrintStream out1 = new PrintStream(new BufferedOutputStream(System.out));
PrintWriter out2 = new PrintWriter(new OutputStreamWriter(System.out));
long star1 = System.nanoTime();
for(int i = 0;i < 100000;i++)
out.write(c);
out.flush();
long star2 = System.nanoTime();
for(int i = 0;i < 100000;i++)
out1.println(c);
out1.flush();
long star3 = System.nanoTime();
for(int i = 0;i < 100000;i++)
out2.write(c);
out2.flush();
long star4 = System.nanoTime();
for(int i = 0;i < 100000;i++)
System.out.println(c);
long end = System.nanoTime();
System.out.println("BufferedWrite: " + (star2 - star1));
System.out.println("PrintStream: " + (star3 - star2));
System.out.println("PrintWrite: " + (star4 - star3));
System.out.println("System.out: " + (end - star4));
}
}
| bw | ps | pw | so |
---|
10^4 | 2917300 | 10372400 | 8201400 | 24582200 | 10^5 | 12636700 | 42724600 | 14679200 | 176504500 |
结论: 优先选择BufferedWrite,然后是PrintWrite,数据量越多,则System.out越拉胯
| bw | ps | pw | so |
---|
10^3 | 128500 | 68300 | 57800 | 51200 | 10^4 | 666200 | 606500 | 619100 | 515000 | 10^5 | | | | |
结论:其实坚定的选择System.out就好,大概在3*10^6左右,ps,pw,so三者数据差不多,好像ps超了so,感觉上应该System.out应该可
ps:抱歉抱歉,先更这么多好了,后面继续刷题出现问题,俺马上继续更新,勿喷或者轻点喷。
|