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

Moh*_*mad 10 arrays coldfusion duplicates

我有一个接收一串标签的函数.为了单独保存标记,该函数将字符串转换为数组:

this.tags = listToArray(this.tags, ", ");

如果存在重复值,如何删除重复值?

小智 18

我喜欢使用Java来完成这类任务:

<cfset tags = "apples,oranges,bananas,pears,apples" />

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

<cfdump var="#tags#" />
<cfdump var="#tagsArray#" />
Run Code Online (Sandbox Code Playgroud)

唯一的问题是需要考虑案例,所以认为"苹果"和"APPLES"是不同的东西(从技术上讲,是的,取决于你的系统可能会有所不同).方法是首先降低列表中的所有内容.

  • @Mohamad - 从纯粹的速度角度来看,我的猜测是HashSet更快.但是......除非你正在处理巨大的清单,否则差异通常很小.我通常选择做正确工作的方法,只有当它成为问题时才担心速度. (2认同)

Ant*_*ony 10

从列表中删除重复项的简单方法是首先将列表转换为结构,然后将结构转换为数组.但是,如果列表中的项目顺序很重要,则可能不合适,因为结构中的元素将被排序.

如果项的顺序很重要,则需要手动构建数组,而不是使用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>
Run Code Online (Sandbox Code Playgroud)


小智 5

由于您实际上是从要转换为数组的字符串/列表开始的,因此可以先将字符串通过ListRemoveDuplicates传递,然后再将其转换为数组。ListRemoveDuplicates在Coldfusion 10中引入;输入参数为(list,delimiter =“,”,ignoreCase = FALSE)。

this.tags = listToArray(listRemoveDuplicates(arrayInput,", ",TRUE));
Run Code Online (Sandbox Code Playgroud)

如果实际上是从数组开始的,则需要先将其转换为列表,然后再转换为列表。

this.tags = listToArray(listRemoveDuplicates(arrayToList(arrayInput),", ",TRUE) );
Run Code Online (Sandbox Code Playgroud)

  • 我想说的是代码本身。只需阅读它,就会清楚发生了什么事。 (5认同)
  • 代码转储不是答案。请编辑您的答案,并解释该代码是什么,如何工作以及如何回答问题。 (3认同)