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

时间:2011-05-27 17:51:49

标签: arrays coldfusion struct

我有一个有趣的问题。我正在为我的应用程序创建一个修订系统。它的工作方式是每次创建一个新的post对象时,post对象都会尝试为每个已更改的属性创建一个历史记录。

因此,如果编辑了post.subject,则会在历史记录表中创建新的修订记录。它只会存储新的主题文本(以及相关的帖子和​​制作它的用户)。如果更改了多个属性,它们将被传入一个数组,每个属性将存储在自己的记录中,并按UUID分组。

为了减少多余的记录,历史记录对象将尝试查找任何现有的修订并更新它们if the existing revisions are younger than a certain time limit.这样我们就可以在同一版本中保持在短时间内进行的更改。如果他们不年轻,那么就会产生新的修订。

情景:

  1. 用户Foo更改帖子的主题(创建主题修订)。
  2. 用户Foo返回并更改正文和主题(更新现有主题修订版;创建新的正文修订版)。这两个版本都需要具有相同的UUID。
  3. 每个帖子对象都有三个属性subject, body, footer。我已经做了很简单的部分:如果不存在,则通过循环包含修订数据的args数组来创建新修订。

    // 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范围中相应修订版的数据更新其数据。
    3. 它不能像arrayContains()那么简单,因为存储在数组中的数据是结构体。我不知道如何比较包含结构的数组!

      问题:

      1. 我是否以正确的方式解决问题?
      2. 我可以使用哪些方法来完成上述功能?

1 个答案:

答案 0 :(得分:1)

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

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

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

他们返回相同的值。因此,如果您愿意,可以使用hashCode()使用public int hashCode()的基础Java方法java.lang.Object来比较结构