ColdFusion - 搜索结构数组的有效方法是什么?

时间:2009-05-14 20:39:14

标签: algorithm arrays search coldfusion struct

我在ColdFusion中有一个半大(数百个记录)的1维数组。数组中的每个项都是具有多个属性的结构。我想在数组中搜索具有特定“name”属性的结构。我知道对于一个字符串值数组,我可以使用像这样的Java方法:

<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”属性,并且数组中没有间隙或其他对象。

5 个答案:

答案 0 :(得分:11)

除非您在构建阵列时创建了哈希表,否则我不会看到您将如何创建比您发布的O(n)解决方案更快的搜索功能。无论如何,在构建阵列时,你可以这样做:

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

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

这假定值始终存在。在进行调用之前,您可能需要检查StructKeyExists(nameValues,“WhatImLookingFor”)。

答案 1 :(得分:6)

在CF 10或Railo 4中,您可以使用:

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

没有记录,但它有效!如果你想要所有的索引,ArrayFindAll()也是一个选项。

答案 2 :(得分:1)

如果不深入研究,我会考虑将结构转换为查询(下方),然后对查询进行查询...假设您的数据集不是太大!

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

分享你最终做的事情!

编辑:建议的StructFindValue看起来也很优秀,我不想查找任何相关的功能。

答案 3 :(得分:0)

CFGroovy FTW! :)

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

或..如果你喜欢更多的java风格(没有闭包)

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

答案 4 :(得分:-1)