2008-08-27 70 views

回答

1

假设数组中的所有值都是简单值,最简单的事情可能是将数组转换为列表,然后进行字符串比较。

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

不像其他解决方案那样优雅,但却很简单。

+0

假设简单的数组,这很容易成为最快最简单的解决方案 – Jason 2008-10-07 19:22:17

11

有一种使用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> 
+0

很多时候人们忘记了我们可以用Java来完成任务。优秀的建议。 – rip747 2009-02-12 13:40:24

2

JASONS答案肯定是最好的,但是这是我以前做过执行的对象的哈希比较已序列化为WDDX。

此方法仅适用于相对较小的数组,但如果要纯粹保留CFML,则这是另一种选择。它也有好处,你可以将该方法应用于其他数据类型以及...

编辑:亚当斯的完全正确(正如你可以看到他的数字) - JSON更经济,不仅在这情况,但对于一般的序列化。在我的辩护中,我被卡在使用没有内置JSON函数的CFMX 6.1,并试图避免外部库。

3

建立在詹姆斯的答案上,我认为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 

虽然数据结构,我序列化是相当复杂的,它很容易被认为是小的。这应该会使得通过WDDX的JSON序列化效率更加可取。无论如何,如果我尝试使用散列比较来编写“compareAnything”方法,那么我会在WDDX上使用JSON序列化。

2

我一直在考虑使用CF的原生Java对象,而这个问题让我想起了一些我的书签作为搜索结果的书签。

ColdFusion数组实际上是java list(java.util.List)的一个实现。所有列表方法实际上都可用于Array。 CF使用数组函数提供了大部分列表功能,但是对于不能直接使用CF函数的java列表,很少有可能。

  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功能。

1

所有这些解决方案都检查两个数组是否相等。他们不检查他们是同一个对象。我知道在原生CF中这样做的唯一方法是以某种方式更改对象,并查看两个引用是否有变化。我也认为应该谨慎依赖CF实现某些Java类,或者揭露方法。这些可能会改变。

至于比较两个阵列以查看是否内容是相同的,为什么不只是 检查长度(如果不同返回false) 如果长度是相同的,从1到阵列LEN并检查元件是相同的如果不是,就打破并返回假。

这将适用于简单的值。

相关问题