如何使用Groovy将字符串数组中的子集复制到int数组?

时间:2010-05-26 16:53:09

标签: java arrays groovy

我在Groovy类中有一个String数组(args到main方法):

String[] args

我想将第3个元素转换为最后一个元素的新数组。除了以下内容之外,还有一种更简单的方法可以在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 个答案:

答案 0 :(得分:5)

这是我的解决方案:

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

2..-1范围选择从第3个到最后的所有元素。 collect方法使用闭包中的代码转换数组的每个元素。最后一个as int[]将从collect方法得到的整数List转换为整数数组。由于Groovy不能使用基本类型,int将始终存储为java.lang.Integer,但您可以使用它们,就好像它们是Java基元一样。从List到数组的转换是可选的。由于Collections是Groovy中的一等公民,并且比Java更容易使用,我更喜欢直接使用Lists而不是数组。

编辑: 或者,您可以将collect方法替换为所谓的spread operator *.,但您必须使用方法asType(int)而不是短版as int

def intArray = args[2..-1]*.asType(int) as int[]

答案 1 :(得分:0)

作为替代方案 - 您尝试将String对象复制到整数。这是不可能的,你得到你应得的 - 一个ClassCastException; - )

至少在Java中 - System.arraycopy仅适用于兼容的数组类型。

你的第一种方法也不错。如果代码看起来太丑陋,只需将其隐藏在具有以下签名的私有方法中:

private int[] parseStrings(String[] args, int start);