Algorithm ColdFusion-What';搜索结构数组的有效方法是什么?
我在ColdFusion中有一个半大型(数百条记录)一维数组。数组中的每个项都是一个具有多个属性的结构。我想在数组中搜索具有特定“name”属性的结构。我知道,对于字符串值数组,我可以使用如下Java方法:Algorithm ColdFusion-What';搜索结构数组的有效方法是什么?,algorithm,arrays,search,coldfusion,struct,Algorithm,Arrays,Search,Coldfusion,Struct,我在ColdFusion中有一个半大型(数百条记录)一维数组。数组中的每个项都是一个具有多个属性的结构。我想在数组中搜索具有特定“name”属性的结构。我知道,对于字符串值数组,我可以使用如下Java方法: <cfset arrayIndex = myArray.indexOf("WhatImLookingFor") + 1> …但这对结构数组不起作用。我也知道我可以这样粗暴地对待它: <cfset arrayIndex = 0> <cfloop from="
<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>
<cfloop query="qryValues">
<cfset nameValues[name] = currentrow />
<cfset myArray[currentrow].name = name />
</cfloop>
<cfset arrayIndex = nameValues["WhatImLookingFor"] />
…但我觉得必须有更有效的方法。有人有比这更好的解决方案吗?您可以假设“name”属性存在于每个结构中,并且数组中没有间隙或其他对象。您想要使用StructFindValue或StructFindKey
不考虑太深,我会考虑将结构转换成查询(以下),然后查询查询。假设你的数据集不是太大
一定要分享你最后做的事情 编辑:StructFindValue建议看起来也很好,我没有想到要查找任何相关函数。FTW!:)
count=myArray.find({
它[“名称”]=“WhatimLooking”}
})
或者。。如果您喜欢更java风格(不带闭包)
for(myArray中的i){
如果(i[“名称”]=“WhatimLooking”)
计数++
}
除非您在构建数组时创建了一个哈希表,否则我看不出您将如何创建一个比您发布的O(n)解决方案更快的搜索函数。无论如何,在构建阵列时,可以执行以下操作:
<cfset arrayIndex = 0>
<cfloop from="1" to="#ArrayLen(myArray)#" index="counter">
<cfif myArray[counter].name IS "WhatImLookingFor">
<cfset arrayIndex = counter>
</cfif>
</cfloop>
<cfloop query="qryValues">
<cfset nameValues[name] = currentrow />
<cfset myArray[currentrow].name = name />
</cfloop>
<cfset arrayIndex = nameValues["WhatImLookingFor"] />
这假定该值始终存在。在进行调用之前,您可能需要检查StructKeyExists(名称值,“WhatImLookingFor”)。在CF 10或Railo 4中,您可以使用:
arrayIndex = ArrayFind(arrayOfStructs, function(struct){
return struct.name == "WhatImLookingFor";
});
它没有文档记录,但它是有效的!如果需要所有索引,ArrayFindAll()也是一个选项。此解决方案是否比问题中公布的原始算法更好?我对Groovy(或CFGroovy)还不是很了解,但看起来您刚刚用另一种语言重新编写了相同的算法。值得一提的是,它更具可读性,也更优雅。。。但是它更快的机会(可能)微乎其微,考虑到它必须由Groovy来运行,然后返回CF。我想如果它在Groovy中速度非常快,那么它的开销可能是值得的,但我对此表示怀疑。这类新函数非常棒。这正是我所需要的,并且在搜索多个条件时它可以工作。我不知道是否有新的方法可以做到这一点,但很高兴找到了这一种:)