2009-05-14 9 views
12

私は、ColdFusionで半大(数百レコード)の1次元配列を持っています。配列の各項目は、いくつかのプロパティを持つ構造体です。特定の「名前」プロパティを持つ構造体を配列で検索したい。文字列値の配列では、Javaメソッドを使用することができます。ColdFusion - 構造体の配列を効率的に検索する方法はありますか?

<cfset arrayIndex = myArray.indexOf("WhatImLookingFor") + 1> 

...しかし、これは構造体の配列に対しては機能しません。

<cfset arrayIndex = 0> 
<cfloop from="1" to="#ArrayLen(myArray)#" index="counter"> 
    <cfif myArray[counter].name IS "WhatImLookingFor"> 
     <cfset arrayIndex = counter> 
    </cfif> 
</cfloop> 

を...しかし、より効率的な方法がなければならないような気がします。また、私はこのようにそれを力ずく可能性が知っています。誰もがこれより良い解決策を持っていますか? "name"プロパティはすべての構造体に存在し、配列にはギャップやその他のオブジェクトがないと仮定できます。

答えて

11

あなたは、配列を構築するとして、あなたが作成しているハッシュテーブルを持っている場合を除き、Iドンあなたが投稿したO(n)のソリューションよりも速い検索機能をどのように作成するのか分かりません。

<cfloop query="qryValues"> 
    <cfset nameValues[name] = currentrow /> 
    <cfset myArray[currentrow].name = name /> 
</cfloop> 

<cfset arrayIndex = nameValues["WhatImLookingFor"] /> 

これは、値が常に存在することを前提としています。あなたはあなたの配列を構築している間、とにかく、あなたはこのような何かを行うことができます。呼び出しを行う前に、StructKeyExists(nameValues、 "WhatImLookingFor")をチェックする必要があります。

arrayIndex = ArrayFind(arrayOfStructs, function(struct){ 
    return struct.name == "WhatImLookingFor"; 
}); 

は、それが文書化されていないが、それは動作します:CF 10またはRailo 4では

+0

それは良い考えです!私はそれを将来使用します。 –

-1
+0

彼が求めているものではありません。 – Henry

1

あまりにも深く、それを見ずStructFindValueかを使用したいですクエリのクエリ..あなたのデータセットがあまりにも巨大ではないと仮定して!

http://www.bennadel.com/blog/264-Ask-Ben-Converting-A-Struct-To-A-Query-And-More-Java-.htm

は、あなたがやってしまったものを共有してください!

編集:StructFindValueは優れているように見えますが、関連する機能を調べるとは思われませんでした。

0

CFGroovy FTW! :)

<cfset count = 0> 
<g:script> 
count = myArray.find({ 
    it["NAME"] == "WhatImLookingFor" } 
}) 
</g:script> 

か..あなたがより多くのJavaのスタイル(W/O閉鎖を)好きなら

<cfset count = 0> 
<g:script> 
for (i in myArray) { 
    if(i["NAME"] == "WhatImLookingFor") 
    count++ 
} 
</g:script> 
+1

このソリューションは、質問に投稿された元のアルゴリズムよりも優れていますか?私はまだGroovy(またはCFGroovy)でよく読みませんが、別の言語で同じアルゴリズムを書き直したように見えます。それは価値があるのですが、それは少し読みやすく、もっとエレガントですが、Groovyを実行してCFに戻る必要があることを考慮すると、より速くなる可能性は(おそらく)スリムではありません。 Groovyの方がはるかに高速であれば、オーバーヘッドがそれに値する可能性がありますが、私はそれを疑っています。 –

5

は、あなたが使用することができます! ArrayFindAll()は、すべてのインデックスが必要な場合のオプションです。

+0

このクラスの新機能は素晴らしいです。 – rhinds

関連する問題