CFML を使用して 2 つの配列が同じかどうかをテストするにはどうすればよいでしょうか?

StackOverflow https://stackoverflow.com/questions/30288

  •  09-06-2019
  •  | 
  •  

質問

CFML (ColdFusion Markup Langauge、別名 ColdFusion) を使用すると、2 つの 1 次元配列が同じかどうかをどのように比較できますか?

役に立ちましたか?

解決

配列内のすべての値が単純な値であると仮定すると、最も簡単な方法は、配列をリストに変換し、単に文字列の比較を行うことかもしれません。

<cfif arrayToList(arrayA) IS arrayToList(arrayB)>
    Arrays are equal!
</cfif>

他のソリューションほど洗練されていませんが、非常にシンプルです。

他のヒント

CFML の基礎となる Java を使用して 2 つの配列を比較する非常に簡単な方法があります。Adobe の Rupesh Kumar による最近のブログ (http://coldfused.blogspot.com/)、ColdFusion 配列は Java リスト (java.util.List) の実装です。したがって、すべての Java リスト メソッドは CFML 配列で使用できます。

したがって、2 つの配列を比較するには、equals メソッドを使用するだけです。配列が等しい場合は YES を返し、等しくない場合は NO を返します。

<cfset array1 = listToArray("tom,dick,harry,phred")/>
<cfset array2 = listToArray("dick,harry,phred") />
<cfset array3 = listToArray("tom,dick,harry,phred")/>

<cfoutput>
Array2 equals Array1 #array2.equals(array1)# (returns a NO) <br/>
Array3 equals Array1 #array3.equals(array1)# (returns a YES) <br/>
</cfoutput>

James の答えに基づいて、WDDX よりも JSON の方が望ましいのではないかと思いました。実際、それはかなり効率的であることが証明されています。ハッシュの比較はそれほどコストがかかりませんが、データをシリアル化してからハッシュを生成すると、(より大きなデータ構造やより複雑なデータ構造の場合) コストがかかる可能性があります。

<cfsilent>
    <!--- create some semi-complex test data --->
    <cfset data = StructNew() />
    <cfloop from="1" to="50" index="i">
        <cfif variables.i mod 2 eq 0>
            <cfset variables.data[variables.i] = StructNew()/>
            <cfset tmp = variables.data[variables.i] />
            <cfloop from="1" to="#variables.i#" index="j">
                <cfset variables.tmp[variables.j] = 1 - variables.j />
            </cfloop>
        <cfelseif variables.i mod 3 eq 0>
            <cfset variables.data[variables.i] = ArrayNew(1)/>
            <cfset tmp = variables.data[variables.i] />
            <cfloop from="1" to="#variables.i#" index="j">
                <cfset variables.tmp[variables.j] = variables.j mod 6 />
            </cfloop>
            <cfset variables.data[variables.i] = variables.tmp />
        <cfelse>
            <cfset variables.data[variables.i] = variables.i />
        </cfif>
    </cfloop>
</cfsilent>

<cftimer label="JSON" type="inline">
    <cfset jsonData = serializeJson(variables.data) />
    <cfset jsonHash = hash(variables.jsonData) />
    <cfoutput>
        JSON: done.<br />
        len=#len(variables.jsonData)#<br/>
        hash=#variables.jsonHash#<br />
    </cfoutput>
</cftimer>
<br/><br/>
<cftimer label="WDDX" type="inline">
    <cfwddx action="cfml2wddx" input="#variables.data#" output="wddx" />
    <cfset wddxHash = hash(variables.wddx) />
    <cfoutput>
        WDDX: done.<br />
        len=#len(variables.wddx)#<br/>
        hash=#variables.wddxHash#<br />
    </cfoutput>
</cftimer>

上記のコードが私のマシンで生成する出力は次のとおりです。

JSON: done.
len=7460
hash=5D0DC87FDF68ACA4F74F742528545B12
JSON: 0ms

WDDX: done.
len=33438
hash=94D9B792546A4B1F2FAF9C04FE6A00E1
WDDX: 47ms

私がシリアル化しているデータ構造はかなり複雑ですが、簡単に小さいと考えられます。これにより、WDDX よりも JSON シリアル化の効率がさらに向上するはずです。

いずれにせよ、ハッシュ比較を使用して「compareAnything」メソッドを作成しようとすると、WDDX 上で JSON シリアル化を使用することになります。

cflib の arrayCompare() ユーザー定義関数がそれを行う必要があります。http://cflib.org/index.cfm?event=page.udfbyid&udfid=1210

Jasonsの答えは確かに最高ですが、私が以前に行ったことは、WDDXにシリアル化されたオブジェクトのハッシュ比較を実行することでした。

この方法は比較的小さな配列にのみ役立ちますが、純粋に CFML を維持したい場合は別のオプションになります。また、このメソッドを他のデータ型にも適用できるという利点もあります。

編集:Adams の言うことは完全に正しいです (彼の数字からわかるように)。この状況だけでなく、シリアル化全般においても、JSON の方がはるかに経済的です。弁護すると、私は JSON 関数が組み込まれていない CFMX 6.1 の使用に行き詰まり、外部ライブラリを避けようとしていたのです。

私はしばらく前に CF のネイティブ Java オブジェクトの使用を検討していましたが、この質問を見て、検索の結果としてブックマークしたいくつかのブログ投稿を思い出しました。

ColdFusion 配列は、実際には Java リスト (java.util.List) の実装です。したがって、すべてのリスト メソッドは実際には Array で使用できます。CF は、配列関数を使用してほとんどのリスト機能を提供しますが、Java リストで実行でき、CF 関数で直接実行できないことはいくつかあります。

  1. 2 つの配列を結合する
  2. 別の配列の途中に配列を追加する
  3. 配列内の要素を検索する
  4. 配列 1 を検索して、配列 2 の要素がすべて見つかったかどうかを確認します
  5. 等価性チェック
  6. 配列 1 の要素を配列 2 から削除します

から: http://coldfused.blogspot.com/2007/01/extend-cf-native-objects-harnessing.html

私が見つけた別のリソースでは、ネイティブ Java Array クラスを使用して一意の値を取得し、たとえば日付の配列を並べ替える必要がある場合にカスタム ソート関数を作成する方法を示しています。

http://www.barneyb.com/barneyblog/2008/05/08/use-coldfusion-use-java/

この 2 番目のリンクには、著者が他の Java クラスをネイティブに使用して、CF 関数よりも機能性や速度を向上させる方法を示す他の投稿へのリンクが含まれています。

これらのソリューションはすべて、2 つの配列が等しいことをチェックします。それらが同じオブジェクトであるかどうかはチェックされません。ネイティブ CF でこれを行う唯一の方法は、オブジェクトを何らかの方法で変更し、両方の参照に変更があるかどうかを確認することです。

また、特定の Java クラスを実装したりメソッドを公開したりする CF に依存することにも注意する必要があると思います。これらは変更される可能性があります。

2つの配列を比較して、内容が同じかどうかを確認するために、長さが1からアレイレンまで同じ場合(異なる返品の場合)長さを確認し、要素が同じブレークであることを確認して、それらがfalseである場合にfalseを確認しないのですかそうではありません。

これは単純な値の場合に機能します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top