从ColdFusion中的多个列表中获取所有可能的唯一值组合

时间:2012-04-06 02:51:04

标签: arrays list coldfusion

这是ColdFusion中的一个似乎应该如此简单的事情......但我找不到简单的道路。

我有一系列的清单。 该数组可以是任何大小,每个列表的长度可以是任何大小。 (这可以被操纵成一个多维数组,无论......重点是,我有一个列表列表)

例如

  1. 129128127

  2. 130131132

  3. 135133134

  4. 137138136

  5. 140139

  6. 141142

  7. 或简短的版本......它可以有所不同

    1. 13,14,15

    2. 11,12

    3. 我需要的是数组,查询或其他一些数据结构 包含所有可能的唯一组合,按顺序从每个列表中取一个......所以对于短版本,将有6个独特的组合。对于第一个较长的例子,我们将有3 * 3 * 3 * 3 * 2 * 2 = 324个独特的组合。

      计算它们很容易......但是以结构化格式获得实际组合的最佳方法是什么? 一定要错过一些简单的事情......我已经好几个小时了! : - /

3 个答案:

答案 0 :(得分:5)

这是我的看法。 积分转到codingforums.com上的帖子中的php函数:http://www.codingforums.com/showpost.php?p=945289&postcount=3 我刚想到如何在cfml中重写它。

<cfscript>
public array function array_cartesian_product(_arrays=[]) {
    var result = [];
    var _arrayslen = arraylen(arguments._arrays);
    var _size = (_arrayslen) ? 1 : 0;
    var _array = '';
    var x = 0;
    var i = 0;
    var j = 0;
    var _current = [];

    for (x=1; x lte _arrayslen; x++) {
        _size = _size * arraylen(arguments._arrays[x]);
        _current[x] = 1;
    }

    for (i=1; i lte _size; i++) {
        result[i] = [];

        for (j=1; j lte _arrayslen; j++) {
            arrayappend(result[i], arguments._arrays[j][_current[j]]);
        }

        for (j=_arrayslen; j gt 0; j--) {
            if (arraylen(arguments._arrays[j]) gt _current[j])  {
                _current[j]++;
                break;
            }
            else {
                _current[j] = 1;
            }
        }

    }

    return result;
}
</cfscript>
<cfset arrays = [[129,128,127],[130,131,132],[135,133,134],[137,138,136],[140,139],[141,142]]>
<cfset r = array_cartesian_product(arrays)>
<cfoutput>#arraylen(r)#</cfoutput>
<cfdump var="#r#">

答案 1 :(得分:1)

这样的事情应该有效。循环遍历第一个列表中的每个项目,并对列表2和3中的每个项目进行组合,然后检查以确保它不在已知列表中,如果没有,则将其添加到组合列表中。

<cfset list1 = "1,2,3" />
<cfset list2 = "4,5,6" />
<cfset list3 = "7,8,9,1" />

<cfset combinations = [] />

<cfloop list="#list1#" index="i">
  <cfif not arrayFind(combinations,i)>
    <cfset arrayAppend(combinations,i) />
  </cfif>
  <cfloop list="#list2#" index="y">
    <cfif not arrayFind(combinations,y)>
      <cfset arrayAppend(combinations,y) />
    </cfif>
    <cfif not arrayFind(combinations, "#i#,#y#")>
      <cfset arrayAppend(combinations,"#i#,#y#") />
    </cfif>
    <cfloop list="#list3#" index="z">
       <cfif not arrayFind(combinations,z)>
         <cfset arrayAppend(combinations,z) />
       </cfif>
       <cfif not arrayFind(combinations, "#i#,#y#,#z#")>
         <cfset arrayAppend(combinations,"#i#,#y#,#z#") />
      </cfif>
    </cfloop>
  </cfloop>
</cfloop>

<cfdump var="#combinations#" />

答案 2 :(得分:0)

好的,所以你需要遍历列表数组。在每次迭代时,您需要针对每个剩余列表遍历该位置的列表。

所以在第一位迭代2 3 4 5 6 在第二位迭代3 4 5 6,依此类推