如何以笛卡尔方式迭代字符串列表?

时间:2019-03-29 04:11:55

标签: java

我有一个字符串,每个元素已划分为5个字符:

  

ss =“ A4A12B2B16A1B01A1B23S1B32A1A32B1B44B2A44A4C16A3D15A4D01A5D23A4E20B1F24A2F17A1F01B0G16A5C34A4C43A5C53A3A50A4D6S4A1A1A4A1A4A1A41A1A4A1A43A1A4A1E4A1E1E1E4A1A1E1E6A4A1A1E4A1A1A4A1A1121

List<String> parts = new ArrayList<>();
int len = ss.length();
int partitionSize=5;
for (int i = 0; i < len; i += partitionSize) {
            parts.add(ss.substring(i, Math.min(len, i + partitionSize)));
        }
System.out.println(parts)

然后,代码将打印出如下内容:

  
    

[A4A12,B2B16,A1B01,A1B23,S1​​B32,A1A32,B1B44,B2A44,A4C16,A3D15,A4D01,A5D23,A4E20,B1F24,A2F17,A1F01,B0G16,A5C34,A4C43,A4C43、50 A0F51,A1F67,S2E46,B1E31,A1F30,A2G36,A1G41,B1G52]

  

我有一个foo函数,只需要两个字符串输入。对于每个i,阵列将从[A4A12,B2B16]增大到[A4A12,B2B16,A1B01]到[A4A12,B2B16,A1B01,A1B23],依此类推,直到列表用完...

当i == 0时,我希望函数评估foo(A4A12,B2B16)

当i == 1时,我希望函数先对foo(A4A12,B2B16)求值,然后对foo(B2B16,A1B01)求值

当i == 3时,我希望函数先计算foo(A4A12,B2B16),然后计算foo(A4A12,A1B01),然后计算foo(A4A12,A1B23),然后计算foo(B2B16,A1B01),然后计算foo(B2B16, A1B23),然后是foo(A1B01,A1B23)。

这是我到目前为止尝试过的

List<List> parts1 = new ArrayList<>();
for (int i=0;i<set.size();i++){
         parts1.add(parts.subList(0,i+1));//increase the size of the array for every iteration
         for (int j=0;j<parts1.size();i++){//how to loop this in a Cartesian way??
                        if(foo(parts.get(j), parts.get(j+1))){
                              return true;}

当然,循环不会以穷举/笛卡尔的方式进行迭代,不是吗?有办法吗?

1 个答案:

答案 0 :(得分:1)

如果要以笛卡尔方式进行迭代,可以执行以下操作:

private void timer1_Tick(object sender, EventArgs e)
{
     timer1.Enabled = false; // write this if you only want this to happen once
     SendMessage(childHwnd, BM_CLICK, 0, 0); 
}

请注意,如果希望第i个笛卡尔乘积,则所有对都必须为foo调用返回true,则必须使用初始化为true的布尔变量,如果为true,则存在一对这样对于这对foo函数将返回false,然后将该布尔变量设置为false。在第i个笛卡尔积处理的最后,您可以检查该布尔变量。