2

非常に簡単なはずの ColdFusion の機能の 1 つを次に示しますが、簡単な方法が見つかりません。

リストの配列があります。配列は任意のサイズにすることができ、各リストの長さは任意のサイズにすることができます。(これは、多次元配列に操作できます。ポイントは、リストのリストを持っていることです)

例えば

  1. 129,128,127

  2. 130,131,132

  3. 135,133,134

  4. 137,138,136

  5. 140,139

  6. 141,142

または短いバージョン...それは異なる場合があります

  1. 13,14,15

  2. 11,12

私が必要とするのは、可能なすべての一意の組み合わせを含む配列、クエリ、またはその他のデータ構造であり、各リストから順番に 1 つ取得します...したがって、短いバージョンでは、6 つの一意の組み合わせがあります。最初の長い例では、3*3*3*3*2*2 = 324 の一意の組み合わせがあります。

それらを数えるのは簡単ですが、構造化された形式で実際の組み合わせを取得する最良の方法は何ですか? 何か単純なものが欠けているに違いない...私は何時間もとても親密でした!:-/

4

3 に答える 3

5

これが私の見解です。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#">
于 2012-04-06T12:49:29.463 に答える
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#" />
于 2012-04-06T12:27:00.673 に答える
0

OKなので、リストの配列をループする必要があります。各反復で、残りの各リストに対してその位置のリストをループする必要があります。

したがって、位置 1 では 2 3 4 5 6 に対して反復し、位置 2 では 3 4 5 6 に対して反復します。

于 2012-04-06T10:25:35.843 に答える