在某些条件下,如何将列表嵌入到Groovy的列表中?

时间:2011-10-16 08:25:36

标签: groovy

我有一个像这样的groovy代码:

main = []
b="ogodtsneeencs"
def input = ["go", "good", "do", "sentences", "tense", "scen"]
(0..(input.size()-1)).each{ Sp(input[it]) }
def Sp(def a)
{
        flag = false
        list = []
        (0..(a.size()-1)).collect { list << a[it] }
        ans = list.permutations().each { temp =  it.join()
                                           if(b.find("$temp"))
                                           {
                                                main << it
                                                flag = true
                                           }
}
        if(flag == false)
                main << null

}
println main

输出:

[[o, g], [g, o], [o, g, o, d], [o, d], [t, s, n, e, e, e, n, c, s], [t, s, n, e, e], [e, n, c, s]]

我在这里做的是找到使用binput中发生的可能排列。而且我正在根据需要获得输出。但是如果仔细注意输出,对于相同的输入go,即(input[0])产生前两个输出,即main[0] and main[1]。既然保持索引的方式(即产生input的{​​{1}}),我如何更改上面的代码,以便输出返回如下:

main

表示同一输入的第一个输出相同,在我们的例子中是[[[o, g], [g, o]], [o, g, o, d], [o, d], [t, s, n, e, e, e, n, c, s], [t, s, n, e, e], [e, n, c, s]]

提前致谢。

2 个答案:

答案 0 :(得分:3)

Artur的解决方案可以进一步改进:

def Sp(a) {
  (a as List).permutations().findAll { s -> b.find( s.join() ) }
}

答案 1 :(得分:2)

我还简化了你的代码:

b="ogodtsneeencs"
def input = ["go", "good", "do", "sentences", "tense", "scen"]
main = input.collect { Sp(it) }
def Sp(a) {
  def list = a as List
  def result = []
  list.permutations().each {
    if (b.find(it.join())) result << it
  }
  result
}

这将输出:

[[[o, g], [g, o]], [[o, g, o, d]], [[o, d]], [[t, s, n, e, e, e, n, c, s]], [[t, s, n, e, e]], [[e, n, c, s]]]

如果你想拥有所有没有封闭集的单例集(正如你在你的例子中写的那样,虽然我觉得它有点不切实际),那么你可以只交换Sp的最后一行到:

result.size() == 1 ? result[0] : result