在OJ中经常遇到在以空格分隔输入数组的情况,在c和c++下还挺好整,在java里头不太好搞了,而且在java这种语法特别冗长的语言中做这种跟主要思想无关的体力活特别烦人( ´_ゝ`)
虽然在python中也只能以类似的方法输入,但体验好多了( ゚∀。)
先看看代码:
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))
//竞赛中一般不用Scanner,因为这玩意儿相比BufferedReader来说实在是太慢了
String[] input = reader.readLine().split(" ");
//先以字符串类型存储用户输入的全部数据,包括空格
//ps:草,没想到Java的String类也自带split方法
int[] numbers = new int[input.length - 1];
for(int i = 0; i < numbers.length; i++) {
numbers[i] = Integer.parseInt(input[i+1]);
}//就是把字符串变成整型数字,不过不能直接强制转换数组,所以害得套个for循环(悲)
System.out.println("Array = "+Arrays.toString(numbers));
}
刚刚讲到python也是以类似的方法输入的,那也来一段code:
List = input()
List = List.split(" ")
[int(List[i]) for i in range(0,len(List)]
只有短短三行,是不是简短多了(喜)
3.22更新
草草草 没想到还有StreamTokenizer这么好用的东西
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
import java.util.Arrays;
public class Main {
public static void main(String[] args) throws IOException {// 不抛掉异常就等着CE吧
StreamTokenizer T = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
/**
* 注意:
* 0.StreamTokenizer的创建必须基于一个输入流
* 1.T.nval的类型为double,若需获取int类型需强制转换
*/
T.nextToken();
int len = (int) T.nval;
int[] arr = new int[len];
for (int i = 0; i < len; i++) {
T.nextToken();
arr[i] = (int) T.nval;
}
System.out.println(Arrays.toString(arr));
}
}
输入:
6 1 1 4 5 1 4
输出:
[1, 1, 4, 5, 1, 4]
注:
- BufferedReader是缓冲流,后面有时间写一篇博客详细介绍一下缓冲流
- 关于StreamTokenizer的使用,这些大佬写得更加详细:
https://www.cnblogs.com/likailiche/p/4462062.html
https://blog.csdn.net/cy973071263/article/details/105588082 - 真要详细了解这些内容,建议阅读官方文档及源码