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

Posted

技术标签:

【中文标题】ColdFusion - 搜索结构数组的有效方法是啥?【英文标题】:ColdFusion - What's an efficient way to search an array of structs?ColdFusion - 搜索结构数组的有效方法是什么? 【发布时间】:2010-10-26 07:45:06 【问题描述】:

我在 ColdFusion 中有一个半大型(数百条记录)一维数组。数组中的每一项都是具有多个属性的结构。我想在数组中搜索具有特定“名称”属性的结构。我知道对于字符串值数组,我可以使用如下 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”属性存在于每个结构中,并且数组中没有间隙或其他对象。

【问题讨论】:

【参考方案1】:

除非您在构建数组时创建了一个哈希表,否则我看不出您将如何创建一个比您发布的 O(n) 解决方案更快的搜索函数。无论如何,在构建数组时,您可以执行以下操作:

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

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

这假定该值始终存在。在拨打电话之前,您可能需要检查 StructKeyExists(nameValues, "WhatImLookingFor")。

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

这类新功能很棒。 这正是我所需要的,它在搜索多个条件时有效。我不知道是否有任何新方法可以做到这一点,但很高兴找到了这个:)【参考方案3】:

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

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

请分享你最终做了什么!

编辑:建议的 StructFindValue 看起来也很棒,我没想到要查找任何相关函数。

【讨论】:

【参考方案4】:

您想要使用 StructFindValue 或 StructFindKey

http://livedocs.adobe.com/coldfusion/7/htmldocs/wwhelp/wwhimpl/common/html/wwhelp.htm?context=ColdFusion_Documentation&file=00000640.htm#137597

http://livedocs.adobe.com/coldfusion/7/htmldocs/wwhelp/wwhimpl/common/html/wwhelp.htm?context=ColdFusion_Documentation&file=00000639.htm#137550

【讨论】:

【参考方案5】:

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>

【讨论】:

这个解决方案是否比问题中发布的原始算法更好?我还没有很好地阅读 Groovy(或 CFGroovy),但它看起来就像您刚刚用另一种语言重新编写了相同的算法。对于它的价值,它更具可读性,并且可以说更优雅......但是考虑到它必须向 Groovy 运行并返回 CF,它的速度更快的机会(可能)几乎为零。我想如果它在 Groovy 中速度非常快,那么开销可能是值得的,但我对此表示怀疑。

以上是关于ColdFusion - 搜索结构数组的有效方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 ColdFusion 认为值“7+”是一个有效的整数值,我如何验证它不是?

从coldfusion调用.net对象上的方法

在另一个数组内的数组中搜索对象的最佳/最有效方法是啥?

简单的 ColdFusion 脚本在 IE 中有效,但在 Firefox 中无效?

JavaScript 数组到 ColdFusion

在 C++ 中存储和搜索数字的最佳方法