2013-10-09 3 views
0

Я заводной новичокGroovy: Создать новый список из двух списка

У меня есть два списка

​list1 = [[1,'Rob','Ben', 'Ni', 'cool'],[2,'Jack','Jo','Raj','Giri']....[]...] 

    list2 = [[null,'2013-10-09','2013-10-10'],[4, '2013-10-11', '2013-10-12']] 

я хочу, чтобы объединить эти списки в следующем формате

list3 = [[1, null, '2013-10-09', '2013-10-10', 'Rob', 'Ben', 'Ni', 'cool'], [2, 4, '2013-10-11', '2013-10-12', 'Jack', 'Jo', 'Raj', 'Giri']] 

пытался Groovy: Add some element of list to another list

но не мог сделать в этом формате .. помогите мне!

+0

добро пожаловать в капот! – danielad

+1

FYI. Модифицирование на '[it [0], это [-3 ..- 1], это [1 ..- 4]]' inside collect [здесь] (http://stackoverflow.com/a/19182756/2051952) будет дайте вам тот же результат, хотя я ручаюсь за ответ Уилла П. :) – dmahapatro

ответ

3

Вы можете collecthead(), pop() и tail():

def list1 = [ [1,'Rob','Ben', 'Ni', 'cool'], [2, 'Jack', 'Jo', 'Raj', 'Giri'] ] 

def list2 = [ [null,'2013-10-09','2013-10-10'],[4, '2013-10-11', '2013-10-12'] ] 

def stack = list2.reverse() 

def list3 = list1.collect { l1 -> 
    [l1.head()] + stack.pop() + l1.tail() 
} 

assert list3 == [ 
    [1, null, '2013-10-09', '2013-10-10', 'Rob', 'Ben', 'Ni', 'cool'], 
    [2,4,'2013-10-11', '2013-10-12', 'Jack', 'Jo', 'Raj', 'Giri'] 
] 
+1

Niceeeee. Когда я рисую операцию внутри 'collect', она напоминает мне отчет о меньшинствах. ;) – dmahapatro

+1

BTW, 'flatten()' не требуется. – dmahapatro

+0

@dmahapatro, правда, обновлено – Will

0

Попробуйте это:

​list1 = [[1,'Rob','Ben', 'Ni', 'cool'],[2,'Jack','Jo','Raj','Giri']....[]...] 
list2 = [[null,'2013-10-09','2013-10-10'],[4, '2013-10-11', '2013-10-12']] 

def list3 = [] 
list3.addAll(list1) 
list3.addAll(list2) 
+0

Я хочу добавить весь элемент списка2 после индекса 0 первого списка – monda

+0

А, ну, извините, я неправильно понял вопрос! – rcgeorge23

1
[list1, list2].transpose().collect { [it[0][0]] + it[1] + it[0][1..-1] } 

будет делать то, что вам нужно, но не особенно эффективен, поскольку он создает и затем выбрасывает много промежуточных списков. Более эффективный подход был бы хорошая старомодной прямой итерация:

def list3 = [] 
def it1 = list1.iterator() 
def it2 = list2.iterator() 
while(it1.hasNext() && it2.hasNext()) { 
    def l1 = it1.next() 
    def l2 = it2.next() 
    def l = [l1[0]] 
    l.addAll(l2) 
    l.addAll(l1[1..-1]) 
    list3 << l 
} 

, который гораздо меньше, Groovy, но и создает гораздо меньше холостые списки.

1

Вот один из способов (очевидно, нуждается в оборонительных проверок в отношении соответствующих размеров list1, list2, пустые списки и т.д.):

def list1 = [[1,'Rob','Ben', 'Ni', 'cool'],[2,'Jack','Jo','Raj','Giri']] 
def list2 = [[null,'2013-10-09','2013-10-10'],[4, '2013-10-11', '2013-10-12']] 

def newList = [] 

list1.eachWithIndex { def subList1, def index -> 
    def tmpList = [] 
    tmpList << subList1[0] 
    tmpList.addAll(list2[index]) 
    tmpList.addAll(subList1[1..subList1.size()-1]) 
    newList << tmpList 
} 

def list3 = [[1, null, '2013-10-09', '2013-10-10', 'Rob', 'Ben', 'Ni', 'cool'], [2,4,'2013-10-11', '2013-10-12', 'Jack', 'Jo', 'Raj', 'Giri']] 

assert newList == list3 
1

Мне нравится, что ответит Уилл, но вот альтернатива:

def list1 = [ [1,'Rob','Ben', 'Ni', 'cool'], [2, 'Jack', 'Jo', 'Raj', 'Giri'] ] 

def list2 = [ [null,'2013-10-09','2013-10-10'],[4, '2013-10-11', '2013-10-12'] ] 

def list3 = [] 
list1.eachWithIndex { one, i -> list3 << [one[0]] + list2[i] + one[1..-1] } 

assert list3 == [ 
    [1, null, '2013-10-09', '2013-10-10', 'Rob', 'Ben', 'Ni', 'cool'], 
    [2, 4,'2013-10-11', '2013-10-12', 'Jack', 'Jo', 'Raj', 'Giri'] 
] 
Смежные вопросы