我有一个二维的字符串值数组:
ABC
-D-
-FG
其中“-”表示空值。 我要实现的是“从左到右”获取数组元素的所有组合,因此给定数组的结果应为:
ABC
ADC
亚足联
AFG
ABG
ADG
应该省略空值,并保持项目顺序。 问题是数组的列数和行数不固定。 我试图玩循环循环(和循环)和递归,但没有成功。在这种情况下,笛卡尔积也是无用的,因为它将产生不必要的组合(我试图动态创建sql临时表并将它们中的值进行交叉联接)。 请有人向我展示一种方法吗?
答案 0 :(得分:1)
如果我正确理解了您的要求,则可以通过使用数组为每个列保存包含要输出的值的行的索引来执行此操作。最初,此数组将为每一列保存第一个非空行。在每次迭代时,您将从要索引的行的最低列开始递增,直到获得非空值或到达行的末尾,在这种情况下,应将行设置回第一个非空值并移至下一列。这类似于汽车中旧里程表的动作。
这里有一些Java代码来说明(对不起,我对VB.Net不熟悉)
char[][] values = {
{'A', 'B', 'C'},
{'-', 'D', '-'},
{'-', 'F', 'G'}
};
int rows = values.length;
int cols = values[0].length;
int[] idx = new int[cols];
// for each column, find the first non-empty character
int i=0;
for(; i<cols; i++)
{
while(idx[i] < rows && values[idx[i]][i] == '-') idx[i]++;
if(idx[i] == rows) break;
}
// if a column was missing a non-empty value then we can't proceed
if(i<cols)
{
System.out.println("Missing value in column " + i);
return;
}
while(true)
{
// print current solution
for(int j=0; j<cols; j++)
System.out.print(values[idx[j]][j]);
System.out.println();
int k=0;
for(; k<cols; k++)
{
// find next non-empty character
do idx[k]++; while(idx[k] < rows && values[idx[k]][k] == '-');
// if there was one, break
if(idx[k] < rows) break;
// else, wrap around to 0, but then find next non-empty row
idx[k] = 0;
while(values[idx[k]][k] == '-') idx[k]++;
}
// if the last index wrapped around then we're done
if(k == cols) break;
}
输出:
ABC
ADC
AFC
ABG
ADG
AFG