2008-08-27 74 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並檢查元件是相同的如果不是,就打破並返回假。

這將適用於簡單的值。

相關問題