我在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)
但它抛出了一个类强制转换异常。
谢谢!
答案 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);