Coldfusion 如何使用CFML测试两个数组是否相同?

Coldfusion 如何使用CFML测试两个数组是否相同?,coldfusion,Coldfusion,使用CFML(ColdFusion Markup Langauge,又名ColdFusion),如何比较两个一维数组是否相同?有一种非常简单的方法可以使用CFML的底层java比较两个数组。根据Adobe()的Rupesh Kumar最近的一篇博客,ColdFusion数组是java列表(java.util.List)的一个实现。因此,所有Java列表方法都可用于CFML数组 因此,要比较两个数组,只需使用equals方法。如果数组相等,则返回YES;如果数组不相等,则返回NO <cfse

使用CFML(ColdFusion Markup Langauge,又名ColdFusion),如何比较两个一维数组是否相同?

有一种非常简单的方法可以使用CFML的底层java比较两个数组。根据Adobe()的Rupesh Kumar最近的一篇博客,ColdFusion数组是java列表(java.util.List)的一个实现。因此,所有Java列表方法都可用于CFML数组

因此,要比较两个数组,只需使用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>

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函数实现的功能

  • 合并两个数组
  • 在另一个数组的中间追加数组
  • 在数组中搜索元素
  • 搜索数组1以查看是否找到了数组2的所有元素
  • 平等检查
  • 从数组2中删除数组1中的元素
  • 发件人:

    我找到的另一个资源展示了如何使用本机Java数组类来获取唯一值,并创建自定义排序函数,以防需要对日期数组进行排序


    第二个链接包含指向其他帖子的链接,作者在这些帖子中展示了如何以本机方式使用其他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>