Groovy   发布时间:2022-04-12  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了算法 – 根据Groovy中的模式在groovy中混合两个列表?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我有两个列表可以说:

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个元素.

编辑:如果一个列表用完了元素,则剩余列表中的项目应该只是添加到最终列表中.

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']

大佬总结

以上是大佬教程为你收集整理的算法 – 根据Groovy中的模式在groovy中混合两个列表?全部内容,希望文章能够帮你解决算法 – 根据Groovy中的模式在groovy中混合两个列表?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。