2011-02-04 37 views
13

下面的java代码存在,但我试图将其转换为groovy。我应该保持它与System.arraycopy一样吗?还是groovy有更好的方法来组合这样的数组?如何在groovy中组合数组?

byte[] combineArrays(foo, bar, start) { 
    def tmp = new byte[foo.length + bar.length] 
    System.arraycopy(foo, 0, tmp, 0, start) 
    System.arraycopy(bar, 0, tmp, start, bar.length) 
    System.arraycopy(foo, start, tmp, bar.length + start, foo.length - start) 
    tmp 
    } 

谢谢

+0

你不使用列表有什么特别的原因吗? – 2011-02-04 19:51:03

+0

如果你打算使用数组,我会保持这样的...没有任何意义的数组转换成列表,然后再返回只是使用一些时髦的风格 – 2011-02-05 13:54:45

回答

8

如果你想使用一个数组:

def abc = [1,2,3,4] as Integer[] //Array 
def abcList = abc as List 
def xyz = [5,6,7,8] as Integer[] //Array 
def xyzList = xyz as List 

def combined = (abcList << xyzList).flatten() 

使用列表:

def abc = [1,2,3,4] 
def xyz = [5,6,7,8] 
def combined = (abc << xyz).flatten() 
+0

这轧液ABC的缘故。如果您需要abc的原始内容,此解决方案将无法工作。 – Jason 2015-03-31 04:12:59

2

这是可以做到这样的:

def newCombine(foo,bar,start) { 
    ([].add + foo[0..<start]+bar+foo[start..<foo.size()]).flatten() 
} 

它适用于各种阵列(字节[])或列表

+1

我会将您的代码更改为 def newCombine(foo,bar,start)def res = [] res << foo [0 .. 2011-02-05 10:15:21

5

我与

byte[] combineArrays(foo, bar, int start) { 
    [*foo[0..<start], *bar, *foo[start..<foo.size()]] 
} 
+0

非常时髦的确。我喜欢!取而代之的foo` – sbglasius 2011-02-05 20:27:37

+1

[开始.. 2011-02-07 10:19:53

3
def a = [1, 2, 3] 
def b = [4, 5, 6] 
a.addAll(b) 
println a 

>> [1, 2, 3, 4, 5, 6]

30
def a = [1, 2, 3] 
def b = [4, 5, 6] 

assert a.plus(b) == [1, 2, 3, 4, 5, 6] 
assert a + b  == [1, 2, 3, 4, 5, 6] 
1

所有的解决方案如果上面的失败去阵列是未定义:

def a = [1,2] 
def b 
assert a+b == [1, 2, null] 

这可能不是你想要的。

def a = [1,2,3,4] 
def b // null array 
def c = [0,4,null,6] 
def abc = [] 
[a,b,c].each{ if (it) abc += it } 
assert abc == [1, 2, 3, 4, 0, 4, null, 6] 

,或者添加所有然后过滤输出:

(a+b+c).findAll{ it != null } 

(在此假设null不在有效的值,如果添加之前存在

要么测试阵列原数组,这意味着第一个解决方案是好了很多,即使它可能不看的Groovy不够。)

0

诀窍是扁平化()方法,即结合d嵌套数组合并为一个:

def a = [1, 2, 3] 
def b = [4, 5, 6] 
def combined = [a, b].flatten() 

assert combined == [1, 2, 3, 4, 5, 6] 

println(combined) 

要删除空值,你可以使用的findAll()这样的:

def a = null 
def b = [4, 5, 6] 
def combined = [a, b].flatten().findAll{it} 

assert combined == [4, 5, 6] 

println(combined)