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

有帮助吗?

解决方案

假设数组中的所有值都是简单值,最简单的方法可能是将数组转换为列表并仅进行字符串比较。

<cfif arrayToList(arrayA) IS arrayToList(arrayB)>
    Arrays are equal!
</cfif>

不像其他提供的解决方案那么优雅,但非常简单。

其他提示

有一种非常简单的方法可以使用 CFML 的底层 java 来比较两个数组。根据 Adob​​e 的 Rupesh Kumar 最近的博客 (http://coldfused.blogspot.com/),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>

根据 James 的回答,我认为 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,它是另一种选择。它还具有的好处是您也可以将该方法应用于其他数据类型......

编辑:Adams 完全正确(从他的数字中可以看出)——JSON 更加经济,不仅在这种情况下,而且对于一般的序列化也是如此。在我看来,我一直在使用没有内置 JSON 函数的 CFMX 6.1,并且试图避免使用外部库。

不久前,我正在研究使用 CF 的本机 Java 对象,这个问题让我想起了一些我在搜索结果中添加书签的博客文章。

ColdFusion数组实际上是java列表(java.util.List)的实现。所以所有的列表方法实际上都可以用于Array。CF 使用数组函数提供了大部分列表功能,但是使用 java 列表可以实现一些无法直接使用 CF 函数完成的功能。

  1. 合并两个数组
  2. 将一个数组附加到另​​一个数组的中间
  3. 搜索数组中的元素
  4. 搜索数组1,看看数组2的元素是否都找到了
  5. 平等检查
  6. 从数组 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 函数的功能或速度。

所有这些解决方案都会检查两个数组是否相等。他们不检查它们是否是同一个对象。我知道在本机 CF 中执行此操作的唯一方法是以某种方式更改对象并查看两个引用是否都有更改。

我还认为您应该警惕依赖 CF 实现某些 java 类或公开方法。这些可能会改变。

至于比较两个数组以查看内容是否相同,为什么不直接 检查长度(如果不同则返回 false) 如果长度相同,从 1 到数组 len 并检查元素是否相同,请中断,如果不是,则返回 false。

这适用于简单的值。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top