使用 CFML(ColdFusion Markup Langauge,又名 ColdFusion),如果两个单维数组相同,您如何比较?
7 回答
有一种非常简单的方法可以使用 CFML 的底层 java 来比较两个数组。根据 Adobe 的 Rupesh Kumar 最近的一篇博客 ( http://coldfused.blogspot.com/),ColdFusion数组是 java 列表 (java.util.List) 的一种实现。因此所有 Java 列表方法都可用于 CFML 数组。
因此,要比较 2 个数组,您需要做的就是使用 equals 方法。如果数组相等则返回 YES,否则返回 NO。
<cfset array1 = listToArray("tom,dick,harry,phred")/>
<cfset array2 = listToArray("dick,harry,phred") />
<cfset array3 = listToArray("tom,dick,harry,phred")/>
<cfoutput>
Array2 equals Array1 #array2.equals(array1)# (returns a NO) <br/>
Array3 equals Array1 #array3.equals(array1)# (returns a YES) <br/>
</cfoutput>
为了建立詹姆斯的回答,我认为 JSON 可能比 WDDX 更可取。事实上,事实证明它的效率要高得多。比较散列并不那么昂贵,但是序列化数据然后生成散列可能是(对于更大和/或更复杂的数据结构)。
<cfsilent>
<!--- create some semi-complex test data --->
<cfset data = StructNew() />
<cfloop from="1" to="50" index="i">
<cfif variables.i mod 2 eq 0>
<cfset variables.data[variables.i] = StructNew()/>
<cfset tmp = variables.data[variables.i] />
<cfloop from="1" to="#variables.i#" index="j">
<cfset variables.tmp[variables.j] = 1 - variables.j />
</cfloop>
<cfelseif variables.i mod 3 eq 0>
<cfset variables.data[variables.i] = ArrayNew(1)/>
<cfset tmp = variables.data[variables.i] />
<cfloop from="1" to="#variables.i#" index="j">
<cfset variables.tmp[variables.j] = variables.j mod 6 />
</cfloop>
<cfset variables.data[variables.i] = variables.tmp />
<cfelse>
<cfset variables.data[variables.i] = variables.i />
</cfif>
</cfloop>
</cfsilent>
<cftimer label="JSON" type="inline">
<cfset jsonData = serializeJson(variables.data) />
<cfset jsonHash = hash(variables.jsonData) />
<cfoutput>
JSON: done.<br />
len=#len(variables.jsonData)#<br/>
hash=#variables.jsonHash#<br />
</cfoutput>
</cftimer>
<br/><br/>
<cftimer label="WDDX" type="inline">
<cfwddx action="cfml2wddx" input="#variables.data#" output="wddx" />
<cfset wddxHash = hash(variables.wddx) />
<cfoutput>
WDDX: done.<br />
len=#len(variables.wddx)#<br/>
hash=#variables.wddxHash#<br />
</cfoutput>
</cftimer>
这是上面代码在我的机器上生成的输出:
JSON: done.
len=7460
hash=5D0DC87FDF68ACA4F74F742528545B12
JSON: 0ms
WDDX: done.
len=33438
hash=94D9B792546A4B1F2FAF9C04FE6A00E1
WDDX: 47ms
虽然我要序列化的数据结构相当复杂,但它很容易被认为很小。这应该使 JSON 序列化在 WDDX 上的效率更加可取。
无论如何,如果我要尝试使用哈希比较编写“compareAnything”方法,我会使用 JSON 序列化而不是 WDDX。
cflib 中的 arrayCompare() 用户定义函数应该这样做 http://cflib.org/index.cfm?event=page.udfbyid&udfid=1210
Jasons 的回答当然是最好的,但我之前做过的事情是对已序列化为 WDDX 的对象进行哈希比较。
此方法仅对相对较小的数组有用,但如果您想保持纯粹的 CFML,它是另一种选择。它还具有您可以将该方法应用于其他数据类型的好处......
编辑:亚当斯完全正确(从他的数字可以看出)- JSON 更经济,不仅在这种情况下,而且对于一般的序列化。在我的辩护中,我坚持使用没有内置 JSON 函数的 CFMX 6.1,并试图避免使用外部库。
不久前我正在研究使用 CF 的本机 Java 对象,这个问题让我想起了一些我在搜索结果中添加书签的博客文章。
ColdFusion 数组实际上是 java 列表 (java.util.List) 的一个实现。所以所有的列表方法实际上都可用于 Array。CF 使用 Array 函数提供了大部分列表功能,但使用 java list 可以做的事情很少,而您不能直接使用 CF 函数来做这些事情。
- 合并两个数组
- 在另一个数组的中间追加一个数组
- 在数组中搜索一个元素
- 搜索数组 1 以查看数组 2 的元素是否都找到
- 平等检查
- 从数组 2 中删除数组 1 中的元素
来自:http ://coldfused.blogspot.com/2007/01/extend-cf-native-objects-harnessing.html
我发现的另一个资源显示了如何使用本机 Java Array 类来获取唯一值并创建自定义排序函数,以防您需要对日期数组进行排序。
http://www.barneyb.com/barneyblog/2008/05/08/use-coldfusion-use-java/
第二个链接包含指向其他帖子的链接,其中作者展示了如何在本地使用其他 Java 类来获得功能或速度超过 CF 函数。
假设数组中的所有值都是简单值,最简单的方法可能是将数组转换为列表并进行字符串比较。
<cfif arrayToList(arrayA) IS arrayToList(arrayB)>
Arrays are equal!
</cfif>
不像其他解决方案那样优雅,但非常简单。
所有这些解决方案都检查两个数组是否相等。他们不检查它们是否是同一个对象。我知道在本机 CF 中这样做的唯一方法是以某种方式更改对象并查看两个引用是否都有更改。
我还认为您应该警惕依赖 CF 实现某些 java 类或公开方法。这些可能会发生变化。
至于比较两个数组看内容是否相同,为什么不只检查长度(如果不同则返回false)如果从1到数组len的长度相同,并检查元素是否相同break,如果它们返回false不是。
这适用于简单的值。