我有一个二维列表,其中行数在1到5之间,每行中的元素数是动态的。 假设我有一个类似
的列表values = [[1,2,3], [4,5],[6,7,8,9]];
result = [[1,4,6],[1,4,7],[1,4,8],[1,4,9],[1,5,6],[1,5,7],[1,5,8],[1,5,9],[2,4,6],[2,4,7],[2,4,8],[2,4,9],[2,5,6],[2,5,7],[2,5,8],[2,5,9],[3,4,6],[3,4,7],[3,4,8],[3,4,9],[3,5,6],[3,5,7],[3,5,8],[3,5,9]]
值是我的输入,我需要以结果格式显示输出。
我尝试以递归方式实现功能,但失败了。 我的功能是
import groovy.transform.Field
List lines = [];
def function(row, col, lines)
{
if(row >= values.size())
{
log.info("This should go inside result: " + lines);
return;
}
if(col >= values[row].size())
{
return;
}
lines << values[row][col];
function(row+1,col,lines);
lines.pop();
function(row,col+1,lines);
return;
}
@Field
List values = [[1,2,3],[4,5],[6,7,8,9]];
@Field
List lst = [];
for(int i=0; i<values[0].size(); i++)
function(0, i, lines)
答案 0 :(得分:5)
Groovy具有内置的收集功能combinations()
,可从元素列表中生成所有可能的组合。
用法示例:
assert [['a', 'b'],[1, 2, 3]].combinations() == [['a', 1], ['b', 1], ['a', 2], ['b', 2], ['a', 3], ['b', 3]]
您可以从初始脚本中简单地在values
上调用此方法:
def values = [[1,2,3], [4,5],[6,7,8,9]]
def expected = [[1,4,6],[1,4,7],[1,4,8],[1,4,9],[1,5,6],[1,5,7],[1,5,8],[1,5,9],[2,4,6],[2,4,7],[2,4,8],[2,4,9],[2,5,6],[2,5,7],[2,5,8],[2,5,9],[3,4,6],[3,4,7],[3,4,8],[3,4,9],[3,5,6],[3,5,7],[3,5,8],[3,5,9]]
def result = values.combinations()
assert ((expected as Set) == (result as Set))
import groovy.transform.CompileStatic
import groovy.transform.TailRecursive
@TailRecursive
@CompileStatic
<T> List<List<T>> combinations(final List<List<T>> xss, final List<List<T>> result = [[]]) {
return !xss ? result : combinations(xss.tail(), process(xss.head(), result))
}
@CompileStatic
<T> List<List<T>> process(final List<T> xs, final List<List<T>> result) {
return result.inject([]) { yss, ys -> yss + xs.collect { x -> ys + x } }
}
def values = [[1,2,3], [4,5],[6,7,8,9]]
def expected = [[1,4,6],[1,4,7],[1,4,8],[1,4,9],[1,5,6],[1,5,7],[1,5,8],[1,5,9],[2,4,6],[2,4,7],[2,4,8],[2,4,9],[2,5,6],[2,5,7],[2,5,8],[2,5,9],[3,4,6],[3,4,7],[3,4,8],[3,4,9],[3,5,6],[3,5,7],[3,5,8],[3,5,9]]
assert combinations(values) == expected
答案 1 :(得分:1)
class Some {
static main(args) {
def values = [[1,2,3], [4,5],[6,7,8,9]];
int[] index = new int[values.size()];
index.eachWithIndex { v, i ->
index[i] = 0
}
print "["
recursive(index, values);
print "]"
}
public static recursive(int[] index, def values){
print "["
(0..(index.length - 1) ).each { i ->
print values[i][index[i]] + ( i == index.length - 1 ? "" : ",")
}
print "]"
boolean allVisited = false;
for(int i = index.length - 1; i >= 0; i-- ){
if (index[i] < values[i].size() - 1){
index[i]++;
for(int j = i + 1; j < index.length; j++ ){
index[j] = 0;
}
break;
}else if (i == 0){
allVisited = true;
break;
}
}
if (!allVisited){
print ", "
recursive(index, values);
}
}
}
这是递归算法。希望对您有所帮助。