2011-05-27 89 views
0

我有一個有趣的問題。我正在爲我的應用程序創建一個修訂系統。它的工作方式是每創建一個新的post對象,post對象都會嘗試爲每個已更改的屬性創建一個歷史記錄。如何比較兩個有序數組中的結構數據?

因此,如果post.subject被編輯,則會在歷史記錄表中創建一個新的修訂記錄。它只會存儲新的主題文本(以及相關的帖子和​​創建它的用戶)。如果多個屬性發生更改,它們將傳遞給一個數組,並且每個屬性都將存儲在其自己的記錄中,並由UUID分組。

爲了減少多餘的記錄,歷史對象將嘗試找到任何現有的修訂並更新它們if the existing revisions are younger than a certain time limit.這樣我們可以在同一修訂版本中保持在短時間段內所做的更改。如果他們不年輕,那麼會創建新的修訂版。

場景:

  1. 用戶foo改變上後所述受檢者(被創建的對象修改)。
  2. User Foo返回並更改主體和主題(現有主題修訂更新;創建新的主體修訂)。兩個修訂都需要具有相同的UUID。

每個帖子對象都有三個屬性subject, body, footer。我已經做了簡單的部分:通過循環包含修訂數據的參數數組,創建新的修訂版(如果不存在)。

// Find existing revisions younger than some time value 
local.revisions = this.findAll(where="rules go here", returnAs="struct"); 

// If no revisions are found create new ones 
if (! arrayLen(local.revisions)) 
{ 
    // Create UUID to group revisions 
    local.revisionGUID = createUUID(); 

    // loop over the arguments array (contains revision data) and create new revisions 
    for (local.i in arguments.data) 
     local.history = this.new(properties=local.i, revisionGUID=local.revisionGUID); 
     local.histroy.save(); 
} 

// If some revision data does exist, update existing ones, and create the new ones; the UUID for new revisions should use the UUID of existing revisions 
else 
{ 
    logic goes here 
} 

現在是棘手的部分。如果一組修訂版本返回,我需要這樣做:

  1. 將它與args作用域中的數組進行比較。
  2. 對於args作用域中現有修訂版數組中不存在的每個修訂版,我需要創建它。對於確實存在的args作用域的修訂(意味着它在年齡限制下具有匹配的修訂版本),我需要使用args作用域中相應修訂的數據更新其數據。

它不能像arrayContains()那樣簡單,因爲存儲在數組中的數據是結構體..我不知道如何比較包含結構體的數組!

問:

  1. 上午我接近問題的正確方法?
  2. 有什麼方法可用於完成上述功能?
+0

使用WDDX或JSON序列化數組內的結構,然後進行字符串比較。 – orangepips 2011-05-27 18:15:59

+0

@orangepips會工作嗎? WDDX中的結構鍵可以保證有序嗎? – Henry 2011-05-27 19:21:50

回答

1

警告:這是高度實驗性的...

<cfset x1 = {a=1,b=2}> 
<cfset x2 = {b=2,a=1}> 

<cfdump var="#x1.hashCode()#"> 
<cfdump var="#x2.hashCode()#"> 

他們返回相同的值。所以,如果你願意,你可以用hashCode()來比較struct的使用底層Java的方法public int hashCode()java.lang.Object

+0

是的,你可能想首先查看那個javadocs;)我記得他們讓我吃驚http://download.oracle.com/javase/6/docs/api/java/lang/Object.html#hashCode%28 %29 – Leigh 2011-05-27 19:43:28