算法 – 根据Groovy中的模式在groovy中混合两个列表?
发布时间:2020-12-14 16:22:56 所属栏目:大数据 来源:网络整理
导读:我有两个列表可以说: def list1 = [a,b,c,d,e...]def list2 = [1,2,3,4,5... ] 我希望它们以某种模式混合,以便最终列表如下所示: [A,B,C,1,E,F,G,H,I,J,K,L,5,6 …] 基本上在list1中的每n个元素之后,我从list2获得m个元素. 编辑:如果一个列表用完了元素,
我有两个列表可以说:
def list1 = [a,b,c,d,e...] def list2 = [1,2,3,4,5... ] 我希望它们以某种模式混合,以便最终列表如下所示: 基本上在list1中的每n个元素之后,我从list2获得m个元素. 编辑:如果一个列表用完了元素,则剩余列表中的项目应该只是添加到最终列表中. EDIT2:两个列表都可以将对象作为元素. 我想找到解决这个问题的最有效方法. 解决方法
这是在Groovy中执行此操作的一种方法:
所以我有一个方法组合,它采用带有整数键的映射(所需元素的数量),并将列表作为值: List mix( Map<Integer,List> amounts ) { amounts.collect { k,v -> v.collate( k ) }.transpose().flatten() } 然后,给出: // The letters a to z def list1 = 'a'..'z' // The numbers 1 to 10 def list2 = 1..10 // Call,and ask for 4 of list1 followed by 2 of list2 mix( [ 4:list1,2:list2 ] ) 返回: [ 'a','b','c','d','e','f','g','h','i','j','k','l',6,'m','n','o','p',7,8,'q','r','s','t',9,10 ] (格式化为在这里看起来更好) 正如您所看到的,它首先用尽了数字,当它出现时,列表结束.这是因为当一个列表用完元素时,转置会停止. 编辑: 使用Iterators进行另一种方式(因此它很懒,并且不会消耗比其他方式需要的更多内存): class MixingIterator<T> implements Iterator<T> { private int idx = 0 private List<Iterator> iter private List<Integer> amts MixingIterator( List<List> lists,List<Integer> amounts ) { iter = lists*.iterator() int i = 0 amts = amounts.collectMany { [ i++ ] * it } // OR FOR GROOVY 1.7.8 // amts = amounts.collect { [ i++ ] * it }.flatten() } private void moveIdx() { idx = ++idx % amts.size() } @Override boolean hasNext() { iter*.hasNext().any() } @Override T next() { if( !hasNext() ) { throw new NoSuchElementException() } while( !iter[ amts[ idx ] ].hasNext() ) { moveIdx() } T ret = iter[ amts[ idx ] ].next() moveIdx() ret } @Override void remove() { throw new UnsupportedOperationException() } } 你叫它: def list1 = 'a'..'z' def list2 = 1..10 def ret = new MixingIterator( [ list1,list2 ],[ 4,2 ] ).collect() // OR FOR GROOVY 1.7.8 // def ret = new MixingIterator( [ list1,2 ] ).collect { it } 然后ret将等于: ['a',10,'u','v','w','x','y','z'] (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |