如何从Coldfusion数组中删除重复的值?

如何解决如何从Coldfusion数组中删除重复的值?

| 我有一个接收一串标签函数。为了单独保存标签,该函数字符串转换为数组:
this.tags = listToArray(this.tags,\",\");
如果有重复值,我该如何删除?     

解决方法

从列表中删除重复项的一种简单方法是先将列表转换为结构,然后将结构转换为数组。但是,如果列表中项目的顺序很重要,则这可能不合适,因为该结构中的元素将被排序。 如果项的顺序很重要,则需要手动构建数组,而不是使用listToArray功能。
<!--- CF9 --->
<cfset tags = \"apples,oranges,bananas,pears,APPLES\" />
<cfset tagArray = arrayNew(1) />

<cfloop list=\"#tags#\" index=\"tag\" delimiters=\",\">
    <cfif not ArrayFindNoCase(tagArray,tag)>
        <cfset arrayAppend(tagArray,tag) />
    </cfif>
</cfloop>
    ,我喜欢将Java用于此类任务:
<cfset tags = \"apples,apples\" />

<cfset tagsArray = createObject(\"java\",\"java.util.HashSet\").init(ListToArray(tags)).toArray() />

<cfdump var=\"#tags#\" />
<cfdump var=\"#tagsArray#\" />
唯一的问题是要考虑到大小写,因此认为\“ apples \”和\\“ APPLES \”是不同的东西(从技术上讲,是的,取决于您的系统可能会有所不同)。解决方法是先将列表中的所有内容都小写。     ,由于您实际上是从要转换为数组的字符串/列表开始的,因此可以先将字符串通过ListRemoveDuplicates传递,然后再将其转换为数组。 ListRemoveDuplicates在Coldfusion 10中引入;输入参数为(列表,定界符= \“,\”,ignoreCase = FALSE)。
this.tags = listToArray(listRemoveDuplicates(arrayInput,\",TRUE));
如果实际上是从数组开始的,则需要先将其转换为列表,然后再转换为列表。
this.tags = listToArray(listRemoveDuplicates(arrayToList(arrayInput),TRUE) );
    ,基于Jason Haritou的想法,但是您可以使用Struct在纯CF中做到这一点! (键匹配将不区分大小写)
this.tags = listToArray(this.tags,\");
var tmpStruct = {};

for (var t in this.tags)
    tmpStruct[t] = \"\";

return structKeyArray(tmpStruct);
但是,对于小型列表,我更喜欢安东尼的解决方案。     ,我只需要去重复一个非常大的列表(5k个以上的条目),发现比使用循环快得多的方法。我觉得有必要分享。 将列表转换为数组(您已经有了数组,所以跳过)
<cfset thisArray = ListToArray(thisList)>
使用queryNew(\“ \”)
<cfset thisQuery = QueryNew(\"\")>
创建查询 使用步骤1
<cfset temp = QueryAddColumn(thisQuery,\"items\",\"varChar\",thisArray)>
中的数组向该查询添加列 查询不同的值ѭ9 将结果转换为清单
<cfset returnString = ValueList(qItems.items)>
这是您轻松将此列表转换回数组的简单步骤 我将此编写为易于使用的函数:
<cffunction name=\"deDupList\" output=\"no\" returntype=\"string\">
    <cfargument name=\"thisList\" required=\"yes\">
    <cfargument name=\"thisDelimeter\" required=\"yes\" default=\",\">
    <cfset var loc = StructNew()>

    <cfset loc.thisArray = ListToArray(thisList,thisDelimeter)>
    <cfset loc.thisQuery = QueryNew(\"\")>
    <cfset loc.temp = QueryAddColumn(loc.thisQuery,loc.thisArray)>
    <cfquery name=\"qItems\" dbtype=\"query\">
        SELECT DISTINCT items FROM loc.thisQuery
    </cfquery>
    <cfset loc.returnString = ValueList(qItems.items)>
    <cfreturn loc.returnString>
</cffunction>
我将其标记为其他几种方法,以下是毫秒数的结果: 循环检查> 1个实例的列表:6265 使用亨利的struct方法:2969 上面的方法:31 杰森的方法:30     ,只需将数组放入Struct,然后将其复制回数组即可;) http://www.bennadel.com/blog/432-Using-ColdFusion-Structures-To-Remove-Duplicate-List-Values.htm     ,将jason的答案再进一步一点,这是一个
arrayDistinct
函数。
function arrayDistinct (required array data) {
    var output = arrayNew(1);
    output.addAll(createObject(\"java\",\"java.util.HashSet\").init(arguments.data));
    return output;
}
您可以在这里进行测试:https://trycf.com/gist/62ff904d4500519e3144fc9564d2bce7/acf     ,在CFLib上有几个UDF可以做到这一点,ArrayyDiff(http://www.cflib.org/udf/arrayDiff)和ArrayCompare(http://www.cflib.org/udf/arrayCompare)。 hth, 拉里     ,在Coldfusion 10或Railo 4中,可以使用Underscore.cfc \的uniq()函数:
_ = new Underscore();

uniqueArray = _.uniq(arrayWithDuplicates);
“ 15”的一个优点是,如有必要,它允许您传递转换函数。 注意:我写了Underscore.cfc     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?