I didn't want to extend the years old discussion on this thread, 
http://www.houseoffusion.com/groups/cf-talk/thread.cfm/threadid:19468

I was looking for a custom tag which given two lists list1,list2 will give me 
back a struct with two lists 'toadd' and 'todelete'. 

toadd -- elements from list2 to be added to list1
todelete -- elements from list1 to be deleted (those that are not present in 
list2)

I wrote two versions, one based on lists and the other based on struct, in all 
cases (even smaller sizes), struct version outperforms list version. 

Anyone care to comment? Both versions given below:

STRUCT VERSION:
<!--- usage
<cf_listcompare list1="#list1#" list2="#list2#" returnvariable="abc" 
delimiter=",">
--->
<cfparam name="attributes.list1" default="" type="string">
<cfparam name="attributes.list2" default="" type="string">
<cfparam name="attributes.delimiter" default=",">
<cfparam name="attributes.returnvariable" type="variablename" default="result">
<cfset caller[attributes.returnvariable]=structnew()>
<cfset struct1 = structnew()>
<cfset struct2 = structnew()>
<cfloop list="#attributes.list1#" index="idx" 
delimiters="#attributes.delimiter#">
        <cfset structinsert(struct1,"#idx#","","yes")>
</cfloop>
<cfset list1=structkeylist(struct1,"#attributes.delimiter#")>

<cfloop list="#attributes.list2#" index="idx" 
delimiters="#attributes.delimiter#">
        <cfset structinsert(struct2,"#idx#","","yes")>
</cfloop>
<cfset list2=structkeylist(struct2,"#attributes.delimiter#")>

<cfif attributes.list1 neq "" or attributes.list2 neq "">
        <cfset toadd = structnew()>
        <cfset todelete = structnew()>
        <cfloop list="#list2#" index="idx" delimiters="#attributes.delimiter#">
                <cfif not structkeyexists(struct1,"#idx#")>
                        <cfset structinsert(toadd,"#idx#","")>
                </cfif>
        </cfloop>
        <cfloop list="#list1#" index="idx" delimiters="#attributes.delimiter#">
                <cfif not structkeyexists(struct2,"#idx#")>
                        <cfset structinsert(todelete,"#idx#","")>
                </cfif>
        </cfloop>
        <cfset 
structinsert(caller[attributes.returnvariable],"toadd","#structkeylist(toadd,attributes.delimiter)#")>
        <cfset 
structinsert(caller[attributes.returnvariable],"todelete","#structkeylist(todelete,attributes.delimiter)#")>
</cfif>

LIST VERSION:

<cfparam name="attributes.list1" default="" type="string">
<cfparam name="attributes.list2" default="" type="string">
<cfparam name="attributes.delimiter" default=",">
<cfparam name="attributes.returnvariable" type="variablename" default="result">
<cfset caller[attributes.returnvariable]=structnew()>
<cfif attributes.list1 neq "" or attributes.list2 neq "">
        <cfset toadd = "">
        <cfset todelete = "">
        <cfloop list="#attributes.list2#" index="idx" 
delimiters="#attributes.delimiter#">
                <cfif not 
listfind(attributes.list1,idx,"#attributes.delimiter#") and not 
listfind(toadd,idx,"#attributes.delimiter#")>
                        <cfset toadd = 
listappend(toadd,idx,"#attributes.delimiter#")>
                </cfif>
        </cfloop>
        <cfloop list="#attributes.list1#" index="idx" 
delimiters="#attributes.delimiter#">
                <cfif not 
listfind(attributes.list2,idx,"#attributes.delimiter#") and not 
listfind(todelete,idx,"#attributes.delimiter#")>
                        <cfset todelete = 
listappend(todelete,idx,"#attributes.delimiter#")>
                </cfif>
        </cfloop>
        <cfset 
structinsert(caller[attributes.returnvariable],"toadd","#toadd#")>
        <cfset 
structinsert(caller[attributes.returnvariable],"todelete","#todelete#")>
</cfif>




~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|
Adobe® ColdFusion® 8 software 8 is the most important and dramatic release to 
date
Get the Free Trial
http://ad.doubleclick.net/clk;207172674;29440083;f

Archive: 
http://www.houseoffusion.com/groups/cf-talk/message.cfm/messageid:315997
Subscription: http://www.houseoffusion.com/groups/cf-talk/subscribe.cfm
Unsubscribe: http://www.houseoffusion.com/cf_lists/unsubscribe.cfm?user=89.70.4

Reply via email to