2017-06-29 58 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">