命令行输入引发的思考

需求是从命令行获取一串数字,取出数字,然后求和。群里问的问题,当时眼高手低,想实现下,结果发现踩了好多坑。

首先想到的是使用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