Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm ColdFusion-What';搜索结构数组的有效方法是什么?_Algorithm_Arrays_Search_Coldfusion_Struct - Fatal编程技术网

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

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="

我在ColdFusion中有一个半大型(数百条记录)一维数组。数组中的每个项都是一个具有多个属性的结构。我想在数组中搜索具有特定“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>
<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中速度非常快,那么它的开销可能是值得的,但我对此表示怀疑。这类新函数非常棒。这正是我所需要的,并且在搜索多个条件时它可以工作。我不知道是否有新的方法可以做到这一点,但很高兴找到了这一种:)