代码之家  ›  专栏  ›  技术社区  ›  Yash

在groovy中使用分隔符拆分字符串并避免indexOutboundsException

  •  2
  • Yash  · 技术社区  · 6 年前

    我想分割一个输入参数 inputDetails 单位层面。我用记号化来做这件事。这是我的代码:

    Groovy代码:

    def inputDetails = "1234-a0-12;1111-b0-34";
    def cDesc = inputDetails.tokenize(";");
    for (int i=0; i<cDesc.size(); ++i)
    {
        def cVer = cDesc.get(i);
        def cNum = cVer.tokenize("-");
        def a = cNum.get(0);
        def b = cNum.get(1);
        def c = cNum.get(2);
    
        println (" DEBUG : Input details are, ${a} : ${b} : ${c} \n");
    }
    

    输出:

     DEBUG : Input details are, 1234 : a0 : 12 
    
     DEBUG : Input details are, 1111 : b0 : 34
    

    此输出是正确的和预期的。但如果我将groovy代码的第一行改为:

    def inputDetails = "1234-a0-12;1111-b0";
    

    我收到以下错误消息:

     java.lang.IndexOutOfBoundsException: Index: 2, Size: 2
        at java_util_List$get$6.call(Unknown Source)
        at Script1.run(Script1.groovy:9)
    

    我怎样才能把它修好 IndexOutOfBoundsException 在支持两者的同时, 1234-a0-12;1111-b0-34 1234-a0-12;1111-b0 输入?

    2 回复  |  直到 6 年前
        1
  •  2
  •   Szymon Stepniak    6 年前

    你可以用groovy的 multiple assignment 从第二个标记化中安全获取3个值的功能。考虑以下示例:

    def inputDetails = "1234-a0-12;1111-b0-34"
    
    def cDesc = inputDetails.tokenize(";")
    
    cDesc.each { part ->
        def (p1, p2, p3) = part.tokenize('-')
    
        println "DEBUG: Input details are, ${p1} : ${p2} : ${p3}"
    }
    

    输出:

    DEBUG: Input details are, 1234 : a0 : 12
    DEBUG: Input details are, 1111 : b0 : 34
    

    好的是这种方法可以防止 IndexOutOfBoundsException NullPointerException . 如果我们把第一行改成

    def inputDetails = "1234-a0-12;1111-b0"
    

    结果是:

    DEBUG: Input details are, 1234 : a0 : 12
    DEBUG: Input details are, 1111 : b0 : null
    
        2
  •  1
  •   ernest_k Petronella    6 年前

    可以通过进一步拆分“-”将字符串拆分为二维列表:

    def inputDetails = "1234-a0-12;1111-b0-34"
    def elements = inputDetails.split(';').collect{it.split('-')}
    

    elements 属于类型 List<List<String>> . 打印时,会产生:

    [[1234, a0, 12], [1111, b0, 34]]
    

    这样,您就可以提供更大的灵活性,而不是硬编码数组索引。

    "1234-a0-12;1111-b0" ,它被分成 [[1234, a0, 12], [1111, b0]]