web-dev-qa-db-fra.com

Comment combiner un tableau en groovy?

Le code Java existe mais j'essaie de le convertir en groovy. Dois-je simplement le conserver tel quel avec System.arraycopy ou groovy a-t-il une meilleure façon de combiner des tableaux comme celui-ci ?

  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
  }

Je vous remercie

23
JimmyBond07
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]
44
Thermech

Si vous souhaitez utiliser un tableau:

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

Utilisation des listes:

def abc = [1,2,3,4]
def xyz = [5,6,7,8]
def combined = (abc << xyz).flatten()
10
stan229
def a = [1, 2, 3]
def b = [4, 5, 6]
a.addAll(b)
println a

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

7
altern

J'irais avec

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

Cela pourrait se faire comme ceci:

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

Il fonctionne pour toutes sortes de tableaux (octet []) ou listes

2
sbglasius

L'astuce est la méthode flatten (), qui combinait des tableaux imbriqués en un seul:

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)

Pour supprimer des valeurs nulles, vous pouvez utiliser findAll () comme ceci:

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

assert combined == [4, 5, 6]

println(combined)
2
Brother

Toutes les solutions ci-dessus échouent si un tableau n'est pas défini:

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

ce qui n'est probablement pas ce que vous voulez.

Soit tester si le tableau existe avant d'ajouter:

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] 

ou ajoutez tout, puis filtrez la sortie:

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

(en supposant ici que null n'est pas une valeur valide dans les tableaux d'origine, ce qui implique que la première solution est bien meilleure, même si elle ne semble pas assez Groovy.)

1
sebnukem