2

我想将输入参数拆分inputDetails为单位级别。我正在使用 tokenize 来执行此操作。这是我的代码:

常规代码:

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-341234-a0-12;1111-b0输入?

4

2 回答 2

3

您可以使用 Groovy 的多重赋值功能从第二个标记化中安全地获取 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

好处是这种方法可以防止IndexOutOfBoundsExceptionor NullPointerException。如果我们将第一行更改为

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

结果是:

DEBUG: Input details are, 1234 : a0 : 12
DEBUG: Input details are, 1111 : b0 : null
于 2018-06-08T05:43:46.013 回答
2

您可以通过在“-”上进一步拆分将字符串拆分为 2D 列表:

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]]

于 2018-06-07T17:45:49.323 回答