如何比较两个有序数组中的结构数据?

问题描述:

我有一个有趣的问题。我正在为我的应用程序创建一个修订系统。它的工作方式是每创建一个新的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

警告:这是高度实验性的...

<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