【问题标题】:Split command line arguments into string array --- Java将命令行参数拆分为字符串数组---Java
【发布时间】:2015-12-17 01:46:27
【问题描述】:

我是 Java 新手,但仍然习惯于面向对象编程(C 程序员)。

命令行参数:AB5、BC4、CD8、DC8、DE6、AD5、CE2、EB3、AE7

代码:

public static void main(String[] args)
{   
    String[] edges = args[0].split("[, ]"); 

    for(int i = 0; i < 9; i++)
        System.out.println(edges[i]);
}

我认为它的作用:

应该使用空格和逗号作为分隔符将第一个参数拆分为字符串数组。我想打印出来看看它是否正常工作,但在打印出“AB7”后我收到了这条消息:

线程“main”中的异常 java.lang.ArrayIndexOutOfBoundsException: 1 on line 8

我做错了什么?

【问题讨论】:

  • 不要使用拆分。命令行参数以数组形式出现,因为它们以空格分隔。

标签: java arrays string command-line-arguments


【解决方案1】:

这实际上是对所有逗号和空格的拆分。 "[, ]" 是一个正则表达式。你得到这个异常是因为你已经超出了边数组的长度。

而不是在 9 中硬编码,您应该在循环不变量中使用数组的长度来避免这个问题。

public static void main(String[] args)
{   
    String[] edges = args[0].split("[, ]"); 

    for(int i = 0; i < edges.length; i++)
        System.out.println(edges[i]);
}

但在您的示例中,参数实际上已经在空格处拆分并存储到 args 数组中。

您可以忘记逗号,只需将参数传递为:

AB5 BC4 CD8 DC8 DE6 AD5 CE2 EB3 AE7

然后像这样遍历它们:

public static void main(String[] args)
{
    for(int i = 0; i < args.length; i++)
        System.out.println(args[i]);
}

【讨论】:

    【解决方案2】:

    见下面的代码。命令行参数已经用空格分隔,因此您不需要传递任何逗号分隔的字符串并调用 split。

    public class Test {
        public static void main(String[] args)
        {   
            String[] edges = args;//args[0].split("[, ]"); 
    
            for(int i = 0; i < edges.length; i++)
                System.out.println(edges[i]);
        }   
    }
    

    【讨论】:

      【解决方案3】:

      您可以在 args 中使用单独的命令行参数。但是,如果您的用户坚持写逗号作为装饰:

      public static void main(String[] args){   
         String[] edges = String.join( " ", args ).split("[, ]"); 
         for(int i = 0; i < edges.length; i++)
            System.out.println(edges[i]);
         }
      }
      

      这也将去掉逗号,如果有的话。

      【讨论】:

        【解决方案4】:

        在 Java 中你需要这样做

        1) 为你的正则表达式创建一个模式

        Pattern pattern = Pattern.compile("[ ,]") ;
        

        2) 现在你需要将它与你的输入相匹配

        Matcher matcher = pattern.matcher(input);
        

        3) 可以如下打印

        while(matcher.find()){
             System.out.println(String.format("found match of %s at %d and %d ",  matcher.group(), matcher.start(), matcher.end()));
         }
        
        // sample code
        public static void main(String[] args){
        StringBuilder sb = new StringBuilder();
            for(String arg: args){
                sb.append(arg);
            }
        
            Matcher matches = Pattern.compile("[ ,]").matcher(sb);
            while(matches.find()){
                System.out.println(String.format("found match of %s at %d and %d ",    matches.group(), matches.start(), matches.end()));
            }
        }  
        

        【讨论】:

          猜你喜欢
          • 2023-03-21
          • 2011-03-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-12-10
          • 2014-09-18
          • 2016-04-01
          相关资源
          最近更新 更多