Как объединить массив в заводной? - PullRequest
17 голосов
/ 04 февраля 2011

Следующий Java-код существует, но я пытаюсь преобразовать его в Groovy. Должен ли я просто сохранить его как у System.arraycopy или у 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
  }

Спасибо

Ответы [ 7 ]

38 голосов
/ 22 февраля 2013
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]
8 голосов
/ 04 февраля 2011

Если вы хотите использовать массив:

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()
6 голосов
/ 31 января 2013
def a = [1, 2, 3]
def b = [4, 5, 6]
a.addAll(b)
println a

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

5 голосов
/ 05 февраля 2011

Я бы пошел с

byte[] combineArrays(foo, bar, int start) {
  [*foo[0..<start], *bar, *foo[start..<foo.size()]]
}
2 голосов
/ 05 февраля 2011

Это можно сделать так:

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

Работает для всех видов массивов (байт []) или списков

1 голос
/ 15 сентября 2017

Хитрость заключается в методе flatten (), который объединяет вложенные массивы в один:

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)
1 голос
/ 10 сентября 2014

Все вышеприведенные решения завершаются ошибкой, если массив не определен:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...