使用Coldfusion阵列作为计数器

问题描述 投票:0回答:1

我使用二维 Coldfusion 数组作为计数器来跟踪不同的出现次数。但是,我发现由于数组声明很大,处理需要很长时间。我就是这样做的:

<!--- retrieve data from the first db --->
<cfquery datasource="xxx" name="mylist">
SELECT id, pattern1
FROM mydatabase
</cfquery>

<!--- initialize the array --->
<cfset myarray = ArrayNew(2)>
<cfloop index = "i" from = "1" to = "8000">
    <cfset myarray [#i#][1] = i>
    <cfset myarray [#i#][2] = 0>    
</cfloop>

<!--- start accumulating. adigit can be any numbers from 1 to 8000 and can repeat  --->
<cfoutput query="mylist">
     <cfquery datasource="xxx" name="mylist">
     SELECT adigit
     FROM otherdatabase
     WHERE pattern2 = #pattern1#
    </cfquery>
    .....
    <cfset myarray[adigit][2] = myarray[adigit][2] + 1>
</cfoutput>

<!--- sort them in descending order --->
<cfloop index="outer" from="1" to="#arrayLen(myarray )#">
 <cfloop index="inner" from="1" to="#arrayLen(myarray )-1#">
    <cfif myarray [inner][2] lt myarray [outer][2]> 
         <cfset arraySwap(myarray ,outer,inner)>
    </cfif>
 </cfloop> 
</cfloop>

adigit字段可以是1到8000之间的任意数字。所有重复的数字都应该累加。例如,如果 adigit=45 出现 12 次,则 myarray[45][1] = 45 且 myarray[45][2] = 12。但是,结果数组的值可能只有 8000 中的 400。其余的都将是 0,因为它们没有匹配的数字。

由于所有“未使用”的数组和排序,处理时间比平时要长。有没有更有效的方法来做到这一点?

提前谢谢您。

arrays sorting coldfusion
1个回答
0
投票

你可以做的一件事就是改变这一点:

<cfoutput query="mylist">
     <cfquery datasource="xxx" name="mylist">
     SELECT adigit
     FROM otherdatabase
     WHERE pattern2 = #pattern1#
    </cfquery>
    .....
    <cfset myarray[adigit][2] = myarray[adigit][2] + 1>
</cfoutput>

像这样:

 <cfquery datasource="xxx" name="mylist">
 SELECT adigit
 FROM otherdatabase
 WHERE pattern2 = in (valuelist from previous query)
 ORDER by adigit
</cfquery>

<cfoutput query="myList">
<cfset myarray[adigit][2] = myarray[adigit][2] + 1>
</cfoutput>

之后就很难说了,因为不清楚你想要实现什么。

© www.soinside.com 2019 - 2024. All rights reserved.