Удаление дубликатов из списка

У меня есть список строк, и мне нужно удалить дубликаты. Я пробовал несколько вещей, таких как:

К сожалению, ни один из них не работал. Я действительно не уверен, что происходит. Поэтому любая помощь будет оценена по достоинству.

В настоящее время я использую бесплатную версию ColdFusion 10 для разработчиков на случай, если это повлияет на ситуацию.

Примерный список:

lacunar_DM, гомоцистеин, HTN, табак, не определено, lacunar_DM, гомоцистеин, табак

Это было создано путем добавления статического списка к динамическому, полученному из базы данных:

<cfsavecontent variable= "lacunar_list">
lacunar_DM,
Homocysteine,
HTN,
Tobacco,
undetermined
</cfsavecontent>
<cfset combination = ListAppend(lacunar_list, lacunar)>

<cfoutput>
List before removing dups: #combination#<br/>
List after removing dups: #listremoveduplicates(combination, ",", true)#<br/>
</cfoutput>

Вот результаты:

Список перед удалением дубликатов:

lacunar_DM, гомоцистеин, HTN, табак, не определено, lacunar_DM, гомоцистеин, табак

Список после удаления дубликатов:

lacunar_DM, гомоцистеин, HTN, табак, не определено, lacunar_DM, гомоцистеин, табак


person Char    schedule 19.03.2013    source источник
comment
Пожалуйста, предоставьте часть вашего кода.   -  person imthepitts    schedule 19.03.2013
comment
И приведите пример строки с дубликатами, которые вы хотите удалить.   -  person Miguel-F    schedule 19.03.2013
comment
Опубликуйте небольшой автономный пример, демонстрирующий проблему.   -  person Leigh    schedule 19.03.2013
comment
Что такое listRemoveDuplicates - это не встроенная функция CF... это ваша собственная функция?   -  person duncan    schedule 19.03.2013
comment
listremoveDuplicates — это поддерживаемая функция, начиная с coldfusion 10 ~Это с веб-сайта Adobe~ Описание Удаляет повторяющиеся значения (если они существуют) в списке. Возвращает Список без повторяющихся значений Синтаксис ListRemoveDuplicates(список[, разделитель] [, ignoreCase]) Свойства Параметр Описание список Обязательный. Список объектов. разделитель Необязательный. Символы, разделяющие элементы списка. Значение по умолчанию — запятая. . ignoreCase Необязательный. Если true, игнорирует регистр строк в списке. По умолчанию установлено значение false.   -  person Char    schedule 19.03.2013
comment
Моя ошибка - я не заметил его на их странице со списком всех новых функций, и его нет на их список всех функций List. Вот ссылка для тех, кому это интересно !   -  person duncan    schedule 19.03.2013
comment
Спасибо за ссылку @duncan. (Добавлено в ОП для лучшей наглядности)   -  person Leigh    schedule 19.03.2013
comment
Проблема может заключаться в том, что вы указываете запятую в качестве разделителя списка, но ваш lacunar_list фактически использует запятую + разрывы строк (предположительно, некоторая комбинация Chr (13) и/или Chr (10)).   -  person duncan    schedule 19.03.2013
comment
Есть ли необходимость в cfsavecontent? Не могли бы вы просто сказать: cfset lacunar_list = lacunar_DM,Homocysteine,HTN,Tobacco,неопределенно? Это также позаботится о ваших непреднамеренных проблемах с интервалами.   -  person Shawn    schedule 20.03.2013


Ответы (5)


Проблема в том, что в списке, который вы создали с помощью cfsavecontent, есть символы новой строки, потому что каждый элемент в этом списке находится на отдельной строке в пределах cfsavecontent. Поскольку другой список, к которому вы присоединяетесь, не имеет такого же пробела, вы не получите правильных результатов.

Как правило, в Coldfusion лучше всего удалять ненужные пробелы из списков.

Попробуйте это вместо использования cfsavecontent:

<cfset lacunar_list = "lacunar_DM,Homocysteine,HTN,Tobacco,undetermined" >
<cfset combination = ListAppend(lacunar_list, lacunar)>
person Russ    schedule 25.03.2013
comment
Я сделал это точно, и это сработало. Благодарю вас! Я был очень расстроен и просто не мог видеть эти белые пятна. Спасибо за ваши зоркие глаза. - person Char; 26.03.2013

Я думаю, ваша проблема в том, что ваш список содержит лишние пробелы. «Гомоцистеин» и «Гомоцистеин» — не одно и то же. Точно так же «Табак» и «Табак» не являются одними и теми же значениями.

lacunar_DM, Homocysteine, HTN, Tobacco, undetermined ,lacunar_DM,Homocysteine,Tobacco
-----------^-------------^----^--------^------------^------------X------------X
person Travis    schedule 19.03.2013
comment
Вот и все Спасибо. Я ненавижу, когда ты часами смотришь на что-то и просто не видишь очевидной проблемы. Спасибо за свежий взгляд. :) - person Char; 26.03.2013

Как уже упоминалось, элементы вашего списка содержат лишние пробелы. Глядя на ваш список, все элементы используют _ в качестве пробелов, поэтому самое простое решение — сначала удалить пробелы, а затем удалить дубликаты.

listRemoveDuplicates( Replace( YourList, " ", "", "ALL" ) )

Если у вас есть допустимые пробелы, я бы предложил использовать Trim() вокруг полей, когда вы составляете список вручную.

YourList = ListAppend( YourList, Trim( ListItem ) )
person Busches    schedule 19.03.2013
comment
Вот оно. Так приятно видеть все эти свежие глаза, когда я потерял перспективу. Спасибо - person Char; 26.03.2013

Убедитесь, что у каждого элемента в списке обрезаны пробелы. " Tobacco" не равно "Tobacco" и не будет рассматриваться как дубликат. В вашем SQL-запросе обрежьте значения, чтобы убедиться, что нет начальных или конечных пробелов. В вашем статическом списке убедитесь, что между запятыми нет пробелов.

person imthepitts    schedule 19.03.2013
comment
Лол, ты опередил меня примерно на 30 секунд. - person Travis; 19.03.2013
comment
Совсем пропустил это. Спасибо, что посмотрели. - person Char; 26.03.2013

Если у вас нет CF10, это мой предпочтительный способ удаления дубликатов из списка.

<cfset newlist = [] />
<cfloop list="#combination#" index="i">
    <cfif NOT arrayFind(newlist,trim(i))> // can also use arrayFindNoCase
     <cfset arrayAppend(newlist,trim(i))>
 </cfif>
</cfloop>

<cfoutput>
    #arraytolist(newlist)#
</cfoutput>
person Matt Busche    schedule 19.03.2013
comment
.. или arrayFindNoCase если вы хотите игнорировать различия в регистре. - person Leigh; 19.03.2013