命令行输入引发的思考
命令行输入引发的思考
需求是从命令行获取一串数字,取出数字,然后求和。群里问的问题,当时眼高手低,想实现下,结果发现踩了好多坑。
首先想到的是使用Scanner获取用户输入字符串,然后转换成字符串数组,然后遍历取出,说干就干。
第一版:
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
System.out.println("please:");
String str = s.nextLine();
str.split("\u0020\u0020");
char[] ch = str.toCharArray();
for(char c : ch){
System.out.println("output:"+c);
}
}
然而结果却是:
please:
23 56 89
output:2
output:3
output:
output:5
output:6
output:
output:8
output:9
output:
很明显不是我们想要的结果啊,这里听了@图灵大大的建议,使用两个空格分割,说是输入流会有影响,但是还是不行,继续修改。
想到了命令行参数
可以使用命令行参数实现,这样程序自动帮我们匹配过滤空格了。
int num[] = new int[10];
System.out.println("args len:" + args.length);
int i=0;
for(String s : args){
System.out.println("args:"+s);
num[i] = Integer.parseInt(s);
i++;
}
这里配置下Eclipse的命令行参数,在Run Configurations->Arguments->program arguments里输入命令行参数,以空格结束.这里的数组使用new来动态分配,不使用会有空指针异常,被它折腾了半天.
结果如下:
program arguments:23 56 89
args len:3
args:23
args:56
args:89
可以看到,成功取到值,但是我就是想在命令直接输入,不想在运行时输入,继续折腾.
想到了正则
最后我才想到它的,它确实很强大。
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
System.out.println("please:");
String str = s.nextLine();
//这里的0是匹配最低的数字位数
Pattern p = Pattern.compile("\\d{0,}");
Matcher m = p.matcher(str);
int i = 0;
while(m.find()){
System.out.print(m.group() + " ");
i++;
}
System.out.print(i);
}
结果如下:
please:
23 56 89
23 56 89 6
可以看到,争取取出了我们的数字,但是这样调用类很麻烦,能不能继续精简呢,想到String的split(regex).
public String[] split(String regex)
可以看到,返回的正好是字符串数组,是我们想要的。进一步优化代码。
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
System.out.println("please:");
String str = s.nextLine();
//这里匹配任意数字
String[] str1 = str.split("\\D+");
for(String st : str1){
System.out.println("output:" + st);
}
}
结果如下:
please:
23 56 89 abc
output:23
output:56
output:89
可以看到,成功取到我们想要的东西,并去掉了不需要的字符串.
这里体会到了正则的强大,但是我感觉命令行参数那个很方便,但是要在运行时输入的,如何才能实现main方法的String args这个功能呢。希望有知道的,可以给我反馈。非常感谢!!
期间踩了不少的坑,主要还是眼高手低。生活中处处有学问,小问题里往往有很大的知识点。
最后由 不一样的少年 编辑于2016年12月22日 12:39
挺好的,感谢博主的分享。
不断学习中
数组是可以求长度的!
args.length
对啊,每种类型的数组都length属性或者length()方法