Как скопировать подмножество из массива строк в массив целых, используя Groovy? - PullRequest
0 голосов
/ 26 мая 2010

У меня есть массив String в классе Groovy (аргументы метода main):

String[] args

Я хотел бы преобразовать третий элемент в последний в новый массив целых чисел.Есть ли более простой способ сделать это в Groovy, кроме:

final int numInts = args.length - 2
final int [] intArray = new int[numInts]
for (int i = 2; i < args.length; i++) {
    intArray[i-2]=Integer.parseInt(args[i])
}

Я хотел сделать:

final int numInts = args.length - 2
final int [] intArray = new int[numInts]
System.arraycopy(args, 2, intArray, 0, numInts)

Но он выдает исключение приведения класса.

Спасибо!

Ответы [ 2 ]

6 голосов
/ 27 мая 2010

Это мое решение:

def intArray = args[2..-1].collect { it as int } as int[]

Диапазон 2..-1 выбирает все элементы от 3-го до последнего. Метод collect преобразует каждый элемент массива, используя код в замыкании. Последний as int[] преобразует Список целых чисел, который является результатом метода collect, в массив целых чисел. Поскольку Groovy не работает с примитивными типами, int всегда будут храниться как java.lang.Integer с, но вы можете работать с ними, как если бы они были примитивами Java. Преобразование из списка в массив необязательно. Поскольку в Groovy коллекции являются первоклассными гражданами и с ними гораздо проще работать, чем в Java, я бы предпочел работать непосредственно со списками, а не с массивами.

EDIT: В качестве альтернативы вы можете заменить метод collect на так называемый оператор распространения *., но вместо краткой версии as int вам придется использовать метод asType(int):

def intArray = args[2..-1]*.asType(int) as int[]
0 голосов
/ 26 мая 2010

В качестве альтернативы - вы пытаетесь скопировать объекты String в целые числа. Это невозможно, и вы получаете то, что заслуживаете - ClassCastException; -)

По крайней мере в Java - System.arraycopy работает только с совместимыми типами массивов.

Ваш первый подход неплох. Если код выглядит слишком уродливо, просто спрячьте его в закрытом методе с такой подписью:

private int[] parseStrings(String[] args, int start);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...