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()而不是嵌套循环,这会更快。这太完美了!