写在前面
本教程是笔者自己的一些学习总结,可能不够全面,但是应对大多数需要手动处理输入、输出的笔试题来说,应该已经足够
输入
读取输入需要导入的包:java.util.Scanner
读取输入的常用方法:
- 读取数字:
nextInt()
(最常用)、nextDouble()
- 读取字符串:
next()
、nextLine()
通常来说,输入有以下几种形式:
1、单独的数字组成了一行(eg: 1
)
2、多个数字组成一行,每个数字之间由空格隔开(eg:1 2 3
)
3、字符和数字组成了一行,由空格隔开(eg:a b 2
)
4、多个单词组成了一行,由空格隔开(eg:apple bee cow
)
接下来,我将针对每一种输入形式,来给出代码实例
1、单独的数字组成了一行(eg:
1
)
这种情况下,通常是采用nextInt()
来读取输入。
这里先说一下nextInt()
的几点注意事项:
1、它会跳过前导的空白符(也就是说,在数字前的空格、回车、制表符都会被跳过)
2、它不会消耗空白符(空格、制表符、回车符会留在缓冲区)
3、因此,当nextInt()
和nextLine()
连续使用的话,会导致后者无法正常读取输入(后者会读取回车符,然后结束读取)(解决办法就是在两者之间插入一条in.nextLine()
import java.util.Scanner;
public class Prac {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
//读取数字
int n = in.nextInt(); //nextInt()不会消耗回车符,但是会跳过前导空白符(空格、回车、制表符)
//in.nextLine(); //在这里可以使用它来消耗掉缓冲区中的回车符
String s = in.nextLine();//此语句读不到任何语句,具体原因参考上方注意事项
}
}
2、多个数字组成一行,每个数字之间由空格隔开(eg:
1 2 3
)
这种情况下直接使用nextInt()
读取就好了,它会自动跳过空格符
import java.util.Scanner;
public class Prac {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
//读取数字
int n = in.nextInt();
int m = in.nextInt();
int l = in.nextInt();
}
}
3、字符和数字组成了一行,由空格隔开(eg:
a b 2
)
4、多个单词组成了一行,由空格隔开(eg:apple bee cow
)
这种字符和数字混合输入,或者多个单词组合的情况,都可以统一处理,可以采用next
或者nextLine()
。
这里说一下两者的注意事项:
1、next()
会跳过前导空白字符(包括回车符),然后读取遇到的第一个空格之前的所有数据,它不会消耗空白字符
2、nextLine()
不会跳过前导空白符,它会读取整行数据,直到遇到回车符,而且它会消耗回车符(但不会存储回车符)
我更喜欢使用后者,所以这里只给出使用nextLine()
的示例
import java.util.Scanner;
public class Prac {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
//假设输入是:abc def(处于同一行)
//把nextLine()读取到的字符串用空格隔开,然后存入字符串数组
String[] strArray = in.nextLine().split(" ");
String s1 = strArray[0];//s1存储:"abc"
String s2 = strArray[1];//s2存储:"def"
}
}
import java.util.Scanner;
public class Prac {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
/**
假设输入如下:
1
abc def
apple
*/
//假设在使用 nextLine()之前使用了 nextInt()
int n = in.nextInt();//n的值:1
in.nextLine();//这行语句用来消耗缓冲区中的回车符
String[] strArray = in.nextLine().split(" ");
String s1 = strArray[0];//s1存储字符串:abc
String s2 = strArray[1];//s2存储字符串:def
//由于 nextLine()会自动消耗回车符,所以可以在读取新的一行时放心使用nextLine()
String s3 = in.nextLine();//这里提前知道第三行只有一个单词,所以不使用split(" ");
}
}
循环读取输入
有些时候,题目可能不会明确给出有多少行数据,而是给出输入终止样式。
这时候需要使用循环不断读取,直到读取到的输入是终止标识。
这种情况下我通常采用的方式是使用hasNextLine()
,来检查输入流中是否还有一行(包括空行),不跳过任何字符。它通常和nextLine()
组合使用
下方我将给出示例代码,提供一个可供使用的模板
import java.util.Scanner;
public class Prac {
public static void main(String[] args) {
...//一些变量定义、声明
/**
假设输入如下:(0000是输入终止标识)
abc
def
ghi
wqr
ape
0000
*/
Scanner in = new Scanner(System.in);
while(in.hasNextLine()){
String s = in.nextLine();
if(s.equals("0000")) //注意!字符串比较要用equals()
break;
list.add(s);//假设定义了一个集合
}
...
}
}