Ответ 1
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]
Следующий 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
}
Спасибо
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]
Если вы хотите использовать массив:
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()
Я бы пошел с
byte[] combineArrays(foo, bar, int start) {
[*foo[0..<start], *bar, *foo[start..<foo.size()]]
}
def a = [1, 2, 3]
def b = [4, 5, 6]
a.addAll(b)
println a
>> [1, 2, 3, 4, 5, 6]
Это можно сделать следующим образом:
def newCombine(foo,bar,start) {
([].add + foo[0..<start]+bar+foo[start..<foo.size()]).flatten()
}
Он работает для всех типов массивов (byte []) или списков
Все вышеперечисленные решения терпят неудачу, если массив undefined:
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.)
Трюк - это метод 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)