Coldfusion 如何比较两个列表元素?

Coldfusion 如何比较两个列表元素?,coldfusion,coldfusion-9,Coldfusion,Coldfusion 9,我有两张单子 <cfset thelist1 = valueList(Gettest.full_name) /> <cfset thelist2 =ReplaceNoCase(colorList2,".jpg","","all")> thelist1 =(test1,test2,test3,test4,test5) thelist2 = (test1,test3) 列表1=(测试1、测试2、测试3、测试4、测试5) 列表2=(测试1,测试3) 如何比较列表1和列

我有两张单子

<cfset thelist1 = valueList(Gettest.full_name) /> 
<cfset thelist2 =ReplaceNoCase(colorList2,".jpg","","all")>

thelist1 =(test1,test2,test3,test4,test5)
thelist2 = (test1,test3)

列表1=(测试1、测试2、测试3、测试4、测试5)
列表2=(测试1,测试3)
如何比较列表1和列表2,并从列表1中获取不在列表2中的元素


我在想,也许要得到列表上没有的列表,我必须创建另一个列表。

在另一个循环中运行嵌套循环

<cfscript>
    theList1 = listToArray("1,2,3");
    theList2 = listToArray("2,3");
    notInList = "";
    for ( i=1 ; i<=arrayLen(theList1) ; i++ ) {
        itemFound = false;
        for ( ii=1 ; ii<=arrayLen(theList2) ; ii++ ) {
            if( theList1[i] EQ theList2[ii] ) {
                itemFound = true;
                break;
            }
        }
        if( !itemFound ){
            notInList = listAppend(notInList,theList1[i]);
        }
    }
</cfscript>

列表1=列表阵列(“1,2,3”);
列表2=列表阵列(“2,3”);
notInList=“”;

对于(i=1;i我将使用一些java方法来实现这一点

<cfset theArray1 = listToArray(thelist1)>
<cfset theArray2= listToArray(thelist2)>

现在,如果我想保留匹配的项目,那么我会这样做:

<cfset theArray1.retainAll(theArray2) />
<cfset thearray1.removeAll(theArrar2) />
QueryExecute("SELECT full_name FROM yourTable WHERE full_name NOT IN ( :filterList )"
    , { filterList={ value=secondList, cfsqltype="CF_SQL_VARCHAR", list="true"} }
);

如果我想删除匹配的项目,那么像这样的事情:

<cfset theArray1.retainAll(theArray2) />
<cfset thearray1.removeAll(theArrar2) />
QueryExecute("SELECT full_name FROM yourTable WHERE full_name NOT IN ( :filterList )"
    , { filterList={ value=secondList, cfsqltype="CF_SQL_VARCHAR", list="true"} }
);

最后,我将把数组转换成一个列表(如果需要的话)


注意
removeAll
retainal
都是java方法,但是在ColdFusion中可以很好地工作,甚至不需要导入java库或包。

NewList变量将包含列表2中没有的列表1元素


另一种选择是使用闭包和标准列表函数来生成第一个列表(而不是第二个列表)中包含的所有元素的列表(或数组):

resultArray = [];
listEach(firstList, function(value, index) {
    if (!listFindNoCase(secondList, value)) {
        arrayAppend(resultArray, value);
    }
});
话虽如此,第一个列表的源似乎是一个数据库查询。如果第二个项目列表相对较小,也可以在数据库查询中执行此操作。只需使用
WHERE NOT IN(…)
子句来检索所提供列表中不包含的所有值。类似如下:

<cfset theArray1.retainAll(theArray2) />
<cfset thearray1.removeAll(theArrar2) />
QueryExecute("SELECT full_name FROM yourTable WHERE full_name NOT IN ( :filterList )"
    , { filterList={ value=secondList, cfsqltype="CF_SQL_VARCHAR", list="true"} }
);

函数fLvL返回数组
[仅第一个,仅第二个,两个]

<cffunction name="fLvL" hint="function List vs List: returns array[listOnlyInFirst, listOnlyInSecond, listInBoth]">
    <cfargument name="argL1" default="">
    <cfargument name="argL2" default="">
    <cfargument name="argDelim" default=",">
    <cfargument name="argDedup" default="1" hint="boolean 0/1 for Y/N, also will work w true/false">
    <cfargument name="argSort" default="0" hint="boolean 0/1 for Y/N, also will work w true/false">
    <cfargument name="argSortType" default="textNoCase" hint="others: numeric, text (case sens), aabzABZ, aAaBbBzzZ">

    <cfset var raRet=["","",""]>
    <cfif !len(argL1)>
        <CFRETURN ["", argL2, ""]>
    <cfelseif !len(argL2)>
        <CFRETURN [argL1, "", ""]>
    </cfif>
    <cfloop index="iL1item" list="#argL1#">
        <cfif listFindNoCase(argL2, iL1item, argDelim)>
            <cfset raRet[3] = listAppend(raRet[3], iL1item, argDelim)>
        <cfelse>
            <cfset raRet[1] = listAppend(raRet[1], iL1item, argDelim)>
        </cfif>
    </cfloop>
    <cfloop index="iL2item" list="#argL2#">
        <cfif !listFindNoCase(argL1, iL2item, argDelim)>
            <cfset raRet[2] = listAppend(raRet[2], iL2item, argDelim)>
        </cfif>
    </cfloop>
    <cfif argSort>
        <cfloop index="iCnt" from="1" to="3">
            <cfset reRet[iCnt] = listSort(reRet[iCnt], argSortType, argDelim)>
        </cfloop>
    </cfif>
    <cfif argDedup>
        <cfloop index="iCnt" from="1" to="3">
            <cfset reRet[iCnt] = listRemoveDuplicates(reRet[iCnt], argDelim)>
        </cfloop>
    </cfif>
    <cfreturn raRet>
</cffunction>

<cfset raResult=fLvL("first,list","second,list")>
<cfdump var="#raResult#">
<!--- returns: ["first","second","list"] --->

raResult=fLvL(“第一,列表”,“第二,列表”)
返回数组:
[“第一”、“第二”、“列表”]


还提供了一些进一步的参数选项(可能有些过分)。

是否要添加列表2中列表1中但列表2中没有的项?
retainal()
removeAll()
是否区分大小写?是的,它区分大小写。如果您想使其不区分大小写,可以使用toupercase或toLowercase方法,然后将列表转换为一个数组。在cflib.org上有一些UDF也可以这样做。像这个-。是的,我同意。两种方法都可以做到。我发现上面的解决方案更好,因为它很好它的代码更少,更干净。所有的事情都由java自己来处理。看起来确实如此。我必须好好玩玩它。不过,大小写可能对一些人来说是个问题。为什么要将列表转换为数组呢?@DanBracuk for scale,在更大的规模下,数组比列表操作更快,使用关联数组在代码中处理起来也更干净n在每次迭代中使用listGetAt。(编辑)数组并不总是比列表操作快。这取决于应用程序。例如,即使有500个项目,上面的代码也比建议的其他两种方法或使用单循环和ListFindLocase ie极快测试要慢得多-1139毫秒,而不是15毫秒。当然,额外的时间中有很大一部分是由于使用嵌套循环。然而,重点是简单地使用数组并不意味着代码运行得更快。这取决于代码。虽然商定的listGetAt与数组表示法相比有点难看。@正如我所说的,在规模上,数组操作比列表快。如果对测试数组funct进行相同的比较,您将嵌套循环与带函数的单循环进行了比较离子与列表函数相比,你会发现在规模上有一个明显的断点,数组开始边缘化列表,然后随着你的增长指数级地超过它们。是的,在小规模上,列表函数将略快于数组,但如果你希望扩展你的应用程序,则不会。但是你是对的,我应该使用arrayFindNoCase()而不是嵌套循环,这会更快。这太完美了!