首页 > 解决方案 > 如何以笛卡尔方式迭代字符串列表?

问题描述

我有一个字符串,每个元素被分成 5 个字符:

ss="A4A12B2B16A1B01A1B23S1B32A1A32B1B44B2A44A4C16A3D15A4D01A5D23A4E20B1F24A2F17A1F01B0G16A5C34A4C43A5C53A3D50A4D61S4E50A0F51A1F67S2E46B1E31A1F30A2G36A1G41B1G52";

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,B1B44,B2A44,A4C16,A3D15,A4D01,A5D23,A5D23,A4E20,A4E20,A4E20,a4e20,a4ey20,a41f24,b1f24,a2f17,a2f17,a2f17,a2f17,a1f01 a151 a5 a5 a151 a5 anf b0g16 a5 anf a15 anf a15 anf a5 anf , 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;}

当然,循环不会以详尽/笛卡尔的方式迭代,不是吗?有没有办法做到这一点?

标签: java

解决方案


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

String ss = "A4A12B2B16A1B01A1B23";
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)));

for (int i=1; i<parts.size(); i++) {
    List<String> pairs = new LinkedList<>();
    for (int j=0;j<=i;j++)
        pairs.add(parts.get(j));
    while(!pairs.isEmpty()) {
        String cur1 = pairs.get(0);
        Iterator<String> it2 = pairs.iterator();
        it2.next(); //discard first element which of course exists
        while(it2.hasNext()) {
            String cur2 = it2.next();
            if(foo(cur1, cur2)) {
                    //...
            }
        }
        pairs.remove(0);
    }
    //end processing of the i-th cartesian product
}

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


推荐阅读