Разделение строки с использованием разделителя в Groovy и исключение IndexOutOfBoundsException - PullRequest
0 голосов
/ 07 июня 2018

Я хочу разделить входной параметр inputDetails до уровня устройства.Я использую токенизатор для этого.Вот мой код:

Groovy Code:

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 ]

0 голосов
/ 08 июня 2018

Вы можете использовать функцию 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

Хорошо, что этот подход предотвращает IndexOutOfBoundsException или NullPointerException.Если мы изменим первую строку на

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

, результат будет:

DEBUG: Input details are, 1234 : a0 : 12
DEBUG: Input details are, 1111 : b0 : null
0 голосов
/ 07 июня 2018

Вы можете разбить строку на двухмерный список, разделив его на '-':

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

...