如何比较两个有序数组中的结构数据?
我有一个有趣的问题。我正在为我的应用程序创建一个修订系统。它的工作方式是每创建一个新的post对象,post对象都会尝试为每个已更改的属性创建一个历史记录。如何比较两个有序数组中的结构数据?
因此,如果post.subject被编辑,则会在历史记录表中创建一个新的修订记录。它只会存储新的主题文本(以及相关的帖子和创建它的用户)。如果多个属性发生更改,它们将传递给一个数组,并且每个属性都将存储在其自己的记录中,并由UUID分组。
为了减少多余的记录,历史对象将尝试找到任何现有的修订并更新它们if the existing revisions are younger than a certain time limit.
这样我们可以在同一修订版本中保持在短时间段内所做的更改。如果他们不年轻,那么会创建新的修订版。
场景:
- 用户foo改变上后所述受检者(被创建的对象修改)。
- 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
}
现在是棘手的部分。如果一组修订版本返回,我需要这样做:
- 将它与args作用域中的数组进行比较。
- 对于args作用域中现有修订版数组中不存在的每个修订版,我需要创建它。对于确实存在的args作用域的修订(意味着它在年龄限制下具有匹配的修订版本),我需要使用args作用域中相应修订的数据更新其数据。
它不能像arrayContains()那样简单,因为存储在数组中的数据是结构体..我不知道如何比较包含结构体的数组!
问:
- 上午我接近问题的正确方法?
- 有什么方法可用于完成上述功能?
警告:这是高度实验性的...
<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
是的,你可能想首先查看那个javadocs;)我记得他们让我吃惊http://download.oracle.com/javase/6/docs/api/java/lang/Object.html#hashCode%28 %29 – Leigh 2011-05-27 19:43:28
使用WDDX或JSON序列化数组内的结构,然后进行字符串比较。 – orangepips 2011-05-27 18:15:59
@orangepips会工作吗? WDDX中的结构键可以保证有序吗? – Henry 2011-05-27 19:21:50