我有两个清单
<cfset thelist1 = valueList(Gettest.full_name) />
<cfset thelist2 =ReplaceNoCase(colorList2,".jpg","","all")>
thelist1 =(test1,test2,test3,test4,test5)
thelist2 = (test1,test3)
如何比较thelist1和thelist2并从list1中获取不在thelist2中的元素?
我想也许要获得不在thelist2上的列表我必须创建另一个thelist3。
答案 0 :(得分:7)
我会使用一些java方法来做到这一点。这是我的工作:
<cfset theArray1 = listToArray(thelist1)>
<cfset theArray2= listToArray(thelist2)>
现在如果我想保留匹配的项目,那么我会做这样的事情:
<cfset theArray1.retainAll(theArray2) />
如果我想删除匹配的项目,那么有些事情是这样的:
<cfset thearray1.removeAll(theArrar2) />
然后我最后将数组转换为列表(如果需要)。
注意removeAll
和retainAll
是java方法,但在ColdFusion中工作正常,您甚至不需要导入java库或包。
答案 1 :(得分:2)
另一种选择是使用闭包和标准列表函数来生成第一个列表中包含的所有元素的列表(或数组),但不第二个:
resultArray = [];
listEach(firstList, function(value, index) {
if (!listFindNoCase(secondList, value)) {
arrayAppend(resultArray, value);
}
});
话虽如此,看起来第一个列表的来源是数据库查询。如果第二个项目列表相对较小,也可以在数据库查询中完成。只需使用WHERE NOT IN (...)
子句检索提供的列表中包含的 not 的所有值。像这样:
QueryExecute("SELECT full_name FROM yourTable WHERE full_name NOT IN ( :filterList )"
, { filterList={ value=secondList, cfsqltype="CF_SQL_VARCHAR", list="true"} }
);
答案 2 :(得分:0)
在另一个循环内运行嵌套循环。
<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>
您将在List1中找到不在List2
中的项目答案 3 :(得分:0)
NewList 变量将包含不在 List2
中的 List1 元素<cfset thelist1 = "test1,test2,test3,test4,test5">
<cfset thelist2 = "test1,test3">
<cfset NewList = ListRemoveDuplicates(thelist1)>
<cfloop list="#thelist2#" index="i">
<cfif listFindNoCase(NewList, i)>
<cfset NewList = listdeleteat(NewList,listFindNoCase(NewList, i))>
</cfif>
</cfloop>
<cfdump var="#NewList#" />
答案 4 :(得分:0)
函数fLvL 返回数组[onlyInFirst, onlyInSecond, inBoth]
:
<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("first,list","second,list")
返回数组:
["first","second","list"]
还提供了其他一些参数选项(可能是过大的)。