2011-02-04 13 views
13

El siguiente código de Java existe, pero estoy tratando de convertirlo en groovy. ¿Debería simplemente mantenerlo como está w/System.arraycopy o Groovy tiene una forma más agradable de combinar matrices como esta?¿Cómo combinar array en 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 
    } 

Gracias

+0

alguna razón en particular no está utilizando las listas? –

+0

Si va a utilizar matrices, lo mantendría así ... no tiene sentido convertir una matriz en una lista y viceversa solo por el simple hecho de usar un estilo maravilloso –

Respuesta

8

Si desea utilizar una matriz:

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() 

Uso de listas:

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

Esto hace que se mueva abc. Si necesita abc con su contenido original, esta solución no funcionará. – Jason

2

Podría hacerse así:

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

Funciona para todo tipo de matrices (byte []) o listas

+1

Cambiaría su código a def newCombine (foo, bar, start) { def res = [] res << foo [0 ..

5

me gustaría ir con

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

Muy bueno de hecho. ¡Me gusta! – sbglasius

+1

En lugar de 'foo [start ..

+0

que podría si estuviera trabajando con listas.para arreglos, tendrá que esperar hasta que se arregle GROOVY-4665 – jpertino

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

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

+0

No funciona si uno de los arreglos es nulo – sebnukem

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

No funciona si uno de los arreglos es nulo – sebnukem

+1

Entonces podría hacer algo (feo pero seguro) así (a?: []). Plus ((b?: [])) O (a?: []) + (B?: []) – Thermech

+3

Haría un '(a + b) .findAll() ' – sebnukem

1

Todas las soluciones anteriores falla si una matriz no está definida:

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

que probablemente no es lo que quieres.

prueba O si la matriz existe antes de añadir:

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] 

, o añadir todos y luego filtrar la salida:

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

(suponiendo aquí que null no es un valor válido en el matrices originales, lo que implica que la primera solución es mucho mejor, incluso si no se ve lo suficientemente Groovy.)

0

El truco es el método flatten(), que combinan d matrices anidadas en una sola:

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) 

Para quitar los valores nulos se puede utilizar findAll() así:

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

assert combined == [4, 5, 6] 

println(combined) 
Cuestiones relacionadas