2017-06-29 54 views
5

我正面临着一段代码的问题,稍作修改我得到了不同的结果,应该不是这样。ColdFusion中数组的奇怪行为

版本1给出了正确的结果,我正面临与实际代码版本2的问题。

版本1:

<cfset keywords = listToArray("1,2,3,4,5,6,7,8,9,10")> 

<!--- Common Code Below ---> 
<cfoutput>#getMetadata(keywords).getName()#</cfoutput> 

<cfset toBeAdded = keywords> 
<cfset toBeInactivated = listToArray("1,3,4,6,8")> 
<cfset toBeActivated = toBeInactivated> 

<cfset toBeAdded.removeAll(toBeInactivated)> 
<cfset toBeInactivated.removeAll(keywords)> 
<cfset toBeActivated.retainAll(keywords)> 

版本2:

<cfset keywords = []> 
<cfloop from="1" to="10" index="counter"> 
    <cfset arrayAppend(keywords, counter)> 
</cfloop> 

<!--- If I add following line here then it is working as expected and similar to version 1: ---> 
<!--- <cfset keywords = listToArray(arrayToList(keywords))> ---> 

<!--- Common Code Below ---> 
<cfoutput>#getMetadata(keywords).getName()#</cfoutput> 

<cfset toBeAdded = keywords> 
<cfset toBeInactivated = listToArray("1,3,4,6,8")> 
<cfset toBeActivated = toBeInactivated> 

<cfset toBeAdded.removeAll(toBeInactivated)> 
<cfset toBeInactivated.removeAll(keywords)> 
<cfset toBeActivated.retainAll(keywords)> 

输出:

enter image description hereenter image description here

这里是要点:Version 1Version 2

任何建议,非常感谢!

回答

5

我没有Java的家伙,但据我可以告诉...

在版本1:keywords包含java.lang.String值,并在第2版:keywords包含java.lang.Double值。

在版本2:toBeInactivated包含要从双打的数组中删除的字符串值。

由于这些Java类型不匹配,它们不会正确从集合中删除。我猜测当CF传递底层对象数据时,它从未正确输出。诚实地说,当所有的东西都没有类型的时候,我会期待CF.

添加从由以下@Twillen的评论,这作品时,你施放counter一种类型的java.lang.String

<cfset keywords = []> 
<cfloop from="1" to="10" index="counter"> 
    <cfset arrayAppend(keywords, javaCast("string", counter))> 
</cfloop> 


<!--- Common Code Below ---> 
<cfoutput>#getMetadata(keywords).getName()#</cfoutput> 

<cfset toBeAdded = keywords> 
<cfset toBeInactivated = listToArray("1,3,4,6,8")> 
<cfset toBeActivated = toBeInactivated> 

<cfset toBeAdded.removeAll(toBeInactivated)> 
<cfset toBeInactivated.removeAll(keywords)> 
<cfset toBeActivated.retainAll(keywords)> 

<cfdump var="#toBeAdded#" label="To Be Added"> 
<cfdump var="#toBeInactivated#" label="To Be Inactivated"> 
<cfdump var="#toBeActivated#" label="To Be Activated"> 
+3

在完成我的工作之前,您已经完成了答案。我想补充的唯一的事情是,你可以得到正矢量二经用'arrayAppend(关键字铸造值的字符串匹配一个版本,JavaCast(“字符串”,计数器)'。 – Twillen

+0

好一点@Twillen。感谢您的。 –

+0

啊,这并没有打动我,谢谢:) – Beginner

0

一个ColdFusion阵列是不是Java Collection对象。所以我质疑removeAll()和retainAll()与这样的数组的使用。考虑到这一点,我的答案是:

<cfset keywords = createobject("java","java.util.Vector").init()> 
<cfset toBeAdded = createobject("java","java.util.Vector").init()> 
<cfloop from="1" to="10" index="counter"> 
    <cfset keywords.add(javaCast("int", counter))> 
    <cfset toBeAdded.add(javaCast("int", counter))> 
</cfloop> 

<!--- Common Code Below ---> 
<cfoutput>#getMetadata(keywords).getName()#</cfoutput> 

<cfset listToBeInactivated = "1,3,4,6,8"> 
<cfset toBeInactivated = createobject("java","java.util.Vector").init()> 
<cfset toBeActivated = createobject("java","java.util.Vector").init()> 
<cfloop list="#listToBeInactivated#" index="index"> 
    <cfset toBeInactivated.add(javaCast("int", index))> 
    <cfset toBeActivated.add(javaCast("int", index))> 
</cfloop> 

<cfset toBeAdded.removeAll(toBeInactivated)> 
<cfset toBeInactivated.removeAll(keywords)> 
<cfset toBeActivated.retainAll(keywords)> 

<cfdump var="#toBeAdded#" label="toBeAdded"> 
<cfdump var="#toBeInactivated#" label="toBeInactivated"> 
<cfdump var="#toBeActivated#" label="toBeActivated">