2015-11-13 5 views
2

У меня есть два спискаКак сравнить два элемента списка?

<cfset thelist1 = valueList(Gettest.full_name) /> 
<cfset thelist2 =ReplaceNoCase(colorList2,".jpg","","all")> 

thelist1 =(test1,test2,test3,test4,test5) 
thelist2 = (test1,test3) 

Как я могу сравнить thelist1 с thelist2 и получить элементы, которые не в thelist2 от thelist1?

Я думал, может быть, чтобы получить список, которого нет в списке2. Мне нужно создать еще один списокlist3.

+0

Нужно ли добавлять элементы в список2, которые есть в списке1, но не в списке2? –

ответ

6

Я хотел бы использовать некоторые методы Java, чтобы сделать это. Вот что я делаю:

<cfset theArray1 = listToArray(thelist1)> 
<cfset theArray2= listToArray(thelist2)> 

Теперь, если я хочу, чтобы сохранить соответствующие элементы, то я хотел бы сделать что-то вроде этого:

<cfset theArray1.retainAll(theArray2) /> 

И если я хочу, чтобы удалить элементы соответствия, то некоторые вещи вот так:

<cfset thearray1.removeAll(theArrar2) /> 

Тогда, наконец, я бы преобразовал массив в список (если это необходимо).

Примечание removeAll и retainAll являются java-методами, но отлично работают в ColdFusion, и вам даже не нужно импортировать библиотеку или пакет java.

+0

'retainAll()' и 'removeAll()' будет корректно обрабатываться с учетом регистра? – Henry

+0

Да, это чувствительный к регистру. Если вы хотите сделать его нечувствительным к регистру, тогда вы можете использовать метод toPpcase или toLowercase, а затем преобразовать список в массив –

+0

Oooh ... Мне нравится эта идея. приятно - спасибо Кешаву. –

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> 

Вы найдете элементы в theList1, которые не theList2

+0

Почему вы конвертируете свои списки в массивы? –

+0

@ DanBracuk для масштабирования, в больших масштабах массивы быстрее, чем операции с списками, а также более чистые для адресации в коде с использованием ассоциативных массивов, чем использование listGetAt для каждой итерации. – rodmunera

+0

(Изменить) * массивы быстрее операций с списками * Не всегда. Это зависит от приложения. Например, с даже 500 элементами код выше значительно медленнее, чем другие два предложенных метода или с использованием одного цикла и listFindNoCase, т.е. очень быстрый тест - 1139 мс против 15 мс. Конечно, хорошая часть дополнительного времени связана с использованием вложенного цикла. Тем не менее, дело в том, что просто использование массивов не означает, что код будет работать быстрее. Это зависит от кода. Хотя согласованный listGetAt немного уродлив по сравнению с нотами массива. – Leigh

0

переменная NewList будет иметь List1 элементы, которые не в List2

<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#" /> 
2

Другой вариант заключается в использовании закрытия и стандартные функции списка, чтобы создать список (или массив) всех элементы, содержащиеся в первом списке, но не второй:

resultArray = []; 
listEach(firstList, function(value, index) { 
    if (!listFindNoCase(secondList, value)) { 
     arrayAppend(resultArray, value); 
    } 
}); 

Сказав это, похоже, что источником первого списка является запрос к базе данных. Если второй список элементов относительно невелик, это также можно сделать в запросе базы данных. Просто используйте предложение WHERE NOT IN (...) для извлечения всех значений , а не, содержащихся в прилагаемом списке. Что-то вроде этого:

QueryExecute("SELECT full_name FROM yourTable WHERE full_name NOT IN (:filterList)" 
    , { filterList={ value=secondList, cfsqltype="CF_SQL_VARCHAR", list="true"} } 
); 
Смежные вопросы