一般情况下,Leetcode上刷题都是核心代码模式,只需要写出solution类就可以了,不用管输入输出。但是许多笔试面试的时候,是需要写输入输出的(ACM模式)。这里简单记录一下可能会用到的输入输出模板。

标准模板

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import java.io.*;
import java.util.*;

public class Main{
public static void main(String[] args) throws Exception{
Scanner in = new Scanner(System.in);
// 整数
int n1 = in.nextInt();
// 浮点数
double n2 = in.nextDouble();
// 一行,不包含末尾分隔符
String s = in.nextLine();
// 输出
System.out.println(n1);
}
}

Scanner的next方法一览

参考[1]

变量和类型 方法 描述
String next() 从此扫描仪查找并返回下一个完整令牌。
String next(String pattern) 如果它与从指定字符串构造的模式匹配,则返回下一个标记。
String next(Pattern pattern) 如果匹配指定的模式,则返回下一个标记。
BigDecimal nextBigDecimal() 将输入的下一个标记扫描为BigDecimal
BigInteger nextBigInteger() 将输入的下一个标记扫描为BigInteger
BigInteger nextBigInteger(int radix) 将输入的下一个标记扫描为BigInteger
boolean nextBoolean() 将输入的下一个标记扫描为布尔值并返回该值。
byte nextByte() 将输入的下一个标记扫描为 byte
byte nextByte(int radix) 将输入的下一个标记扫描为 byte
double nextDouble() 将输入的下一个标记扫描为 double
float nextFloat() 将输入的下一个标记扫描为 float
int nextInt() 将输入的下一个标记扫描为 int
int nextInt(int radix) 将输入的下一个标记扫描为 int
String nextLine() 使此扫描器前进超过当前行并返回跳过的输入。
long nextLong() 将输入的下一个标记扫描为 long
long nextLong(int radix) 将输入的下一个标记扫描为 long
short nextShort() 将输入的下一个标记扫描为 short
short nextShort(int radix) 将输入的下一个标记扫描为 short

EOF

采用hasNext来判断有无下一个输入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import java.util.Scanner;

public class Main {

public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a=1 ;
//判断是否输入结束(系统文件输入)
while(sc.hasNext()){
//获取输入值
a=sc.nextInt();
//...
}

}
}

Scanner的hasNext方法一览

变量和类型 方法 描述
boolean hasNext() 如果此扫描器的输入中有另一个标记,则返回true。
boolean hasNext(String pattern) 如果下一个标记与从指定字符串构造的模式匹配,则返回true。
boolean hasNext(Pattern pattern) 如果下一个完整标记与指定模式匹配,则返回true。
boolean hasNextBigDecimal() 如果此扫描器输入中的下一个标记可以使用 nextBigDecimal()方法解释为 BigDecimal则返回true。
boolean hasNextBigInteger() 如果此扫描器输入中的下一个标记可以使用 nextBigInteger()方法在默认基数中解释为 BigInteger ,则返回true。
boolean hasNextBigInteger(int radix) 如果此扫描器输入中的下一个标记可以使用 nextBigInteger()方法在指定的基数中解释为 BigInteger ,则返回true。
boolean hasNextBoolean() 如果使用从字符串“true | false”创建的不区分大小写的模式,可以将此扫描器输入中的下一个标记解释为布尔值,则返回true。
boolean hasNextByte() 如果使用 nextByte()方法将此扫描器输入中的下一个标记解释为默认基数中的字节值,则返回true。
boolean hasNextByte(int radix) 如果使用 nextByte()方法将此扫描器输入中的下一个标记解释为指定基数中的字节值,则返回true。
boolean hasNextDouble() 如果使用 nextDouble()方法将此扫描仪输入中的下一个标记解释为double值,则返回true。
boolean hasNextFloat() 如果使用 nextFloat()方法将此扫描器输入中的下一个标记解释为浮点值,则返回true。
boolean hasNextInt() 如果使用 nextInt()方法将此扫描器输入中的下一个标记解释为默认基数中的int值,则返回true。
boolean hasNextInt(int radix) 如果此扫描器输入中的下一个标记可以使用 nextInt()方法解释为指定基数中的int值,则返回true。
boolean hasNextLine() 如果此扫描器的输入中有另一行,则返回true。
boolean hasNextLong() 如果使用 nextLong()方法将此扫描器输入中的下一个标记解释为默认基数中的长值,则返回true。
boolean hasNextLong(int radix) 如果使用 nextLong()方法可以将此扫描器输入中的下一个标记解释为指定基数中的长值,则返回true。
boolean hasNextShort() 如果使用 nextShort()方法可以将此扫描器输入中的下一个标记解释为默认基数中的短值,则返回true。
boolean hasNextShort(int radix) 如果此扫描器输入中的下一个标记可以使用 nextShort()方法解释为指定基数中的短值,则返回true。

Scanner分隔符

Scanner使用分隔符模式将其输入分解为标记,该分隔符模式默认匹配空格。 将得到的令牌可以然后被转换成使用各种不同类型的值next方法。

1
Scanner scan = new Scanner(System.in).useDelimiter("\n");

(可配合正则表达式使用)

以WOJ上的2. Genesis - WOJ (whu.edu.cn)为例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import java.util.*;
import java.util.regex.Pattern;

public class Main {
public static void main(String[] args) throws Exception{
Scanner in = new Scanner(System.in);
int n = 0;
String head = in.next();
System.out.print(head+" ");
while(in.hasNext()){
if(in.hasNext("\\d+:\\d+")){
head = in.next();
System.out.print(n+"\n"+head+" ");
n = 0;
}else{
String s = in.next();
if(s.matches("\\w+\\D*")) n++;
}
}
System.out.println(n);
in.close();
}
}


  1. Scanner (Java SE 11 & JDK 11 ) (runoob.com) ↩︎