Coldfusion 如何使用CFML测试两个数组是否相同?
使用CFML(ColdFusion Markup Langauge,又名ColdFusion),如何比较两个一维数组是否相同?有一种非常简单的方法可以使用CFML的底层java比较两个数组。根据Adobe()的Rupesh Kumar最近的一篇博客,ColdFusion数组是java列表(java.util.List)的一个实现。因此,所有Java列表方法都可用于CFML数组 因此,要比较两个数组,只需使用equals方法。如果数组相等,则返回YES;如果数组不相等,则返回NOColdfusion 如何使用CFML测试两个数组是否相同?,coldfusion,Coldfusion,使用CFML(ColdFusion Markup Langauge,又名ColdFusion),如何比较两个一维数组是否相同?有一种非常简单的方法可以使用CFML的底层java比较两个数组。根据Adobe()的Rupesh Kumar最近的一篇博客,ColdFusion数组是java列表(java.util.List)的一个实现。因此,所有Java列表方法都可用于CFML数组 因此,要比较两个数组,只需使用equals方法。如果数组相等,则返回YES;如果数组不相等,则返回NO <cfse
<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>
Array2等于Array1#Array2.等于(Array1)#(返回否)
Array3等于Array1#Array3.等于(Array1)#(返回YES)
cflib中的arrayCompare()用户定义函数应该可以完成此任务
Jasons的答案当然是最好的,但我以前做过的一件事是对序列化为WDDX的对象执行哈希比较 这种方法只对相对较小的数组有用,但如果您想保持它纯粹是CFML,那么它是另一种选择。它还有一个好处,就是您可以将该方法应用于其他数据类型
编辑:Adams完全正确(正如您从他的数字中看到的那样)-JSON更经济,不仅在这种情况下,而且在一般情况下对于序列化也是如此。在我的辩护中,我一直在使用CFMX 6.1,它没有内置JSON函数,并且试图避免使用外部lib。基于James的回答,我认为JSON可能比WDDX更可取。事实证明,它的效率要高得多。比较散列并没有那么昂贵,但是序列化数据然后生成散列可能非常昂贵(对于更大和/或更复杂的数据结构) 虽然我序列化的数据结构相当复杂,但它很容易被认为很小。这将使WDDX上JSON序列化的效率更高
无论如何,如果我尝试使用哈希比较编写一个“compareAnything”方法,我会在WDDX上使用JSON序列化。不久前,我正在研究使用CF的本机Java对象,这个问题让我想起了一些我在搜索过程中加入书签的博客文章 ColdFusion数组实际上是JavaList(java.util.list)的一个实现。所以所有列表方法实际上都可用于数组。 CF使用数组函数提供了大多数列表功能,但java列表中很少有您不能直接使用CF函数实现的功能
第二个链接包含指向其他帖子的链接,作者在这些帖子中展示了如何以本机方式使用其他Java类来获得功能或速度超过CF函数。所有这些解决方案都检查两个数组是否相等。它们不会检查它们是否是同一个对象。我知道在本机CF中这样做的唯一方法是以某种方式更改对象,并查看两个引用中是否都有更改 我还认为,您应该警惕依赖CF实现某些java类或公开方法。这些都可能发生变化 至于比较两个数组的内容是否相同,为什么不 检查长度(如果不同返回值为false) 如果从1到数组len的长度相同,则检查元素是否相同,如果不相同,则返回false
<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>
这将适用于简单值。假设数组中的所有值都是简单值,最简单的方法可能是将数组转换为列表,然后只进行字符串比较
<cfif arrayToList(arrayA) IS arrayToList(arrayB)>
Arrays are equal!
</cfif>
数组是相等的!
不像其他解决方案那样优雅,但非常简单。假设使用简单的数组,这很容易成为最快速、最简单的解决方案很多时候人们忘记了我们可以使用Java来完成任务。很好的建议。
<cfif arrayToList(arrayA) IS arrayToList(arrayB)>
Arrays are equal!
</cfif>