2011-02-04 36 views
13

Mã java sau đây tồn tại nhưng tôi đang cố gắng chuyển đổi nó thành groovy. Tôi có nên đơn giản giữ nó như là w/System.arraycopy hoặc không groovy có một cách đẹp hơn để kết hợp các mảng như thế này?Làm thế nào để kết hợp mảng trong 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 
    } 

Cảm ơn bạn

+0

Bất kỳ lý do cụ thể bạn đang không sử dụng danh sách? –

+0

Nếu bạn đang sử dụng mảng, tôi sẽ giữ nó như thế này ... không có điểm nào trong việc chuyển đổi một mảng thành danh sách và ngược lại chỉ vì lợi ích của việc sử dụng một số kiểu dáng hấp dẫn –

Trả lời

8

Nếu bạn muốn sử dụng một mảng:

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

sử dụng danh sách:

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

. Nếu bạn cần abc với nội dung ban đầu của nó, giải pháp này sẽ không hoạt động. – Jason

2

Nó có thể được thực hiện như thế này:

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

Nó hoạt động cho tất cả các loại mảng (byte []) hoặc danh sách

+1

Tôi muốn thay đổi mã của bạn thành def newCombine (foo, bar, start) { def res = [] res << foo [0 ..

5

Tôi muốn đi với

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

Thực sự rất hấp dẫn. Tôi thích nó! – sbglasius

+1

Thay vì 'foo [start ..

+0

bạn có thể nếu bạn đang làm việc với các danh sách.cho mảng bạn sẽ phải chờ cho đến khi GROOVY-4665 được sửa – jpertino

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

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

+0

Không hoạt động nếu một trong các mảng là null – 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

Không hoạt động nếu một trong các mảng là null – sebnukem

+1

Vì vậy, bạn có thể làm điều gì đó (xấu xí nhưng an toàn) như thế (a?: []). Cộng ((?: [])) Hoặc (a?: []) + (B?: []) – Thermech

+3

Tôi sẽ làm một '(a + b) .findAll() ' – sebnukem

1

Tất cả các giải pháp trên thất bại nếu một mảng không được xác định:

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

có lẽ không phải là thứ bạn muốn.

Hoặc kiểm tra nếu mảng tồn tại trước khi nói thêm:

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] 

, hoặc thêm tất cả và sau đó lọc kết quả:

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

(giả sử ở đây là null không phải là một giá trị hợp lệ trong mảng ban đầu, ngụ ý rằng giải pháp đầu tiên tốt hơn rất nhiều, ngay cả khi nó có thể không đủ Groovy.)

0

Bí quyết là phương thức flatten(), kết hợp d mảng lồng nhau thành một:

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) 

Để loại bỏ các giá trị null bạn có thể sử dụng FindAll() như thế này:

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

assert combined == [4, 5, 6] 

println(combined) 
Các vấn đề liên quan