2011-01-11 8 views
3

다음 함수는 이전에 항목의 새 목록을 비교하고 차이를 발견 : 이전 목록에서 새 목록에 추가 된 두 목록을 비교하고 둘 사이의 차이점을 찾는 방법은 무엇입니까?

  • 항목을 삭제 한

    1. 항목 (에 존재하지 원래 목록).

  • 나는 이것을 달성하기 위해 두 개의 루프를 작성, 그들은 다음과 같은 출력을 생성 :

    oldItems = "an, old, list" ---> Items To Delete: 'an,old'

    newItems = "a, new, list" ---> Items To Create: 'new'

    첫 번째 문제는 a가 만들 수있는 항목에 표시해야하지만, 나는 그것이의 문자열이기 때문에 생각 an 그것은 집어 들지 않습니다.

    두 번째 문제 (?)는 두 개의 루프를 수행하는 것이 비효율적이라고 생각합니다. 코드를 리팩토링 할 수 있습니까?

    public function testList() hint="Compares two lists to find the differences." 
    { 
        local.oldItems = "a, new, list"; 
        local.newItems = "an, old, list"; 
        local.toDelete = ""; 
        local.toCreate = ""; 
    
        // Loop over newItems to find items that do not exist in oldItems 
        for (local.i = 1; local.i LTE ListLen(local.newItems, ", "); local.i++) 
        { 
         if (! ListContains(local.oldItems, ListGetAt(local.newItems, local.i, ", "))) 
         { 
          local.toCreate = ListAppend(local.toCreate, ListGetAt(local.newItems, local.i, ", ")); 
         } 
        } 
    
        // Loop over old items to find items that do not exist in newItems 
        for (local.i = 1; local.i LTE ListLen(local.oldItems, ", "); local.i++) 
        { 
         if (! ListContains(local.newItems, ListGetAt(local.oldItems, local.i, ", "))) 
         { 
          local.toDelete = ListAppend(local.toDelete, ListGetAt(local.oldItems, local.i, ", ")); 
         } 
        } 
    
        writeDump(var="Items To Delete: '" & local.toDelete & "'"); 
        writeDump(var="Items To Create: '" & local.toCreate & "'", abort=true); 
    } 
    

    답변

    5

    예, 귀하의 코드를 리팩터링 할 수 있다고 생각합니다.

    정확한 일치 (대소 문자 포함)를 수행하므로 배열 함수를 사용하는 것을 선호합니다. 이 방법은 "a"가 목록 간의 차이로 선택되도록합니다.

    희망이 도움이 :

    <cfscript> 
        oldList = "an, old, list"; 
        newList = "a, new, list"; 
    
        result = compareLists(oldList, newList); 
    
        writeDump(result); 
    
        // ------------------------------------------------------------------------- 
    
        public struct function compareLists (
         required string listA, 
         required string listB 
        ){ 
    
         local.a = listToArray(arguments.listA, ','); 
         local.b = listToArray(arguments.listB, ','); 
    
         local.itemsNotInListB = []; 
         local.itemsNewInListB = []; 
    
         // Compare all items in 'list A' to 'list B' 
         for (local.item in local.a) { 
          if (!arrayContains(local.b, local.item)) 
          { 
           arrayAppend(local.itemsNotInListB, local.item); 
          } 
         } 
         // Compare all items in 'list B' to 'list A' 
         for (local.item in local.b) { 
          if (!arrayContains(local.a, local.item)) 
          { 
           arrayAppend(local.itemsNewInListB, local.item); 
          } 
         } 
    
         return { 
          newItems = local.itemsNewInListB 
          ,deletedItems = local.itemsNotInListB 
         }; 
        } 
    </cfscript> 
    
    +0

    아론, 이건 정말 끝내 주는데. 고마워. 나는 그것이 일반적으로 나를 위해 매우 유용 할 것이라고 생각한다. 그러나 내 목적을 위해, 나는 하나의 루프를 사용하고 Ray가 언급 한 것처럼 ListFind() 함수를 사용할 것이라고 생각한다. 나는 당신의 UDF가 굉장하다고 생각하지만,이 상황에서는 약간의 과잉이다. 데모 주셔서 감사합니다! – Mohamad

    +0

    걱정할 필요가 없습니다. 하지만, 귀하의 질문에 대답 했어 :) –

    +0

    당신은 실제로 않았다 :) – Mohamad

    0

    2 루프는 실제로 동일한 작업을 수행하지만, 유일한 차이점은 목록이 교체 된 것입니다. 완전히 불필요한. 한 가지 방법 만 점검하면됩니다. 올드 -> 신규. 반대편도 아닙니다 (Old < - New).

    2 목록의 인스턴스를 만들고 하나의 루프를 통해 보내면 이전 목록에 새 항목 중 하나와 동일한 항목이 있는지 확인합니다.

    이전 목록의 local.i가 색인 [7]이고 새 항목에서 확인할 필요가있는 동일한 항목이 색인 [3] 일 수 있으므로 for-loop가 얼마나 좋은지는 잘 모릅니다. ] 가능한 변경 후.

    +0

    ziga, 문제는, 그들을 만들기 위해 추가 된 항목과 삭제 된 항목을 식별해야합니다 ... 사용하지 않고이 작업을 수행 할 수있는 방법을 생각할 수 없습니다. 두 루프 ... – Mohamad

    3

    정확한 일치를 얻기에 대답은 ListContains() 대신 구분 기호로 ListFind() 기능을 사용하는 것입니다

    if (! ListFind(local.oldItems, ListGetAt(local.newItems, local.i, ", "), ", ")) {} 
    

    구분 기호 그렇지 않으면 함수가 시도하고 전체 문자열과 일치합니다 필요합니다.

    리팩토링에 대한 답변이 없습니다.

    2

    당신이 CFLib.org를 검색하려고 했습니까? 차이점을 찾는 기능을 포함하여 여러 목록 기능이 있습니다. 하위 문자열 문제에 대해서는 ListContains에 대한 설명서를 참조하십시오. 이것이 어떻게 작동 해야하는지입니다. ListFind 또는 ListFindNoCase를 대신 사용해보십시오. http://cflib.org/udf/listCompare는 - - 두 번째 목록에 존재하지 않는 첫 번째 목록의 요소를 찾기 위해 또 다른에 대해 하나 개의 목록을 비교

    목록 비교 :

    3

    는 cflib.org 3 목록 UDF에 있습니다. 같은 이름의 사용자 정의 태그와 동일한 기능을 수행합니다.

    목록 Diff - http://cflib.org/udf/ListDiff - 두 목록을 비교하여 두 목록에 나타나지 않는 요소를 반환합니다.

    목록 Diff Dup - http://cflib.org/udf/ListDiffDup -이 함수는 두 목록을 비교하고 두 입력 목록 간의 차이가 포함 된 새 목록을 반환합니다. 이 함수는 목록 내의 중복 요소를 별개의 요소로 취급하므로 ListDiff와 다릅니다.

    3

    진지하게, 바퀴를 재발 명하지 마십시오. 자바 목록 또는 세트를 사용하여 ColdFusion에서는 JVM 꼭대기 실행 : 보너스 here's a link to Java code I drew my example from으로

    <cfscript> 
    oldItems = "an, old, list"; //Items To Delete: 'an,old' 
    newItems = "a, new, list"; //Items To Create: 'a,new' 
    // ArrayList could be HashSet if items in both lists are expected to be unique 
    oldItems = createObject("java", "java.util.ArrayList").init(listToArray(oldItems, ", ")); 
    newItems = createObject("java", "java.util.ArrayList").init(listToArray(newItems, ", ")); 
    
    itemsToDelete = createObject("java", "java.util.HashSet").init(oldItems); 
    itemsToDelete.removeAll(newItems); 
    
    itemsToCreate = createObject("java", "java.util.HashSet").init(newItems); 
    itemsToCreate.removeAll(oldItems); 
    </cfscript> 
    
    <cfoutput> 
    itemsToDelete: #listSort(arrayToList(itemsToDelete.toArray()),"textNoCase")#<br /><!--- an,old ---> 
    itemsToCreate: #listSort(arrayToList(itemsToCreate.toArray()),"textNoCase")#<!--- a,new ---> 
    </cfoutput> 
    

    합니다.

    +0

    저는 Java와 Coldfusion을 함께 사용하는 데 정말로 와야합니다. 자바에 대해서는 거의 알지 못하기 때문에 그것을 사용해야한다는 전망은별로 중요하지 않습니다. 그러나 그것은 매우 단순 해 보이고 기능성으로 가득 차 있습니다. – Mohamad

    +1

    브루스 에켈 (Bruce Eckel) ** 자바 사고 ** http://www.amazon.com/Thinking-Java-4th-Bruce-Eckel/dp/0131872486은 언어 학습을위한 훌륭한 책입니다. 내가 아는 최고의 ColdFusion -> Java 책은 ColdFusion 개발자를위한 ** Java ** http://www.amazon.com/Java-ColdFusion-Developers-Eben-Hewitt/dp/0130461806입니다. – orangepips

    1
    <cfset strListTupla = "SKU,CANTIDAD,VENTA"> 
    <cfset strListSend = "CANTIDAD,SKU"> 
    
    <cfset strListSend = ListSort(strListSend, "textnocase", "asc")> 
    <cfset strListTupla = ListSort(strListTupla, "textnocase", "asc")> 
    
    <cfset strListTupla = ListToArray (strListTupla)> 
    <cfloop index="j" from="1" to="#Arraylen(strListTupla)#"> 
        <cfoutput> 
        <cfif NOT ListFind(strListSend, strListTupla[j])> 
         Not Found #strListTupla[j]# 
        </cfif><br/> 
        </cfoutput> 
    </cfloop> 
    

    그 항목을 검색하여 목록에 있는지 여부를 확인하고 요소가 누락되었음을 표시 할 수 있습니다.

    관련 문제