2011-01-11 13 views
3

Die folgende Funktion eine neue Liste von Elementen zu einem alten vergleicht und findet die Unterschiede:Wie kann ich zwei Listen vergleichen und die Unterschiede zwischen ihnen finden?

  1. Objekte, die von der alten Liste
  2. Artikel gelöscht wurden, die auf die neue Liste hinzugefügt wurden (nicht in die ursprüngliche Liste).

schrieb ich zwei Schleifen dies zu erreichen, und sie erzeugte die folgende Ausgabe:

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

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

Die erste Ausgabe ist a in den Einzelteilen auftauchen sollte zu schaffen, aber ich glaube, weil es ein Teil ist von an es wird nicht abgeholt.

Das zweite Problem (?) Ich mache zwei Schleifen scheint ineffizient. Kann der Code refaktoriert werden?

Antwort

5

Ja, ich glaube, Sie können Ihren Code umgestalten.

Ich bevorzuge die Array-Funktionen, da es eine genaue Übereinstimmung (einschließlich Groß-/Kleinschreibung). Diese Methode stellt sicher, dass "a" als ein Unterschied zwischen den Listen aufgenommen wird.

this helps:

<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

Aaron, das ist super, danke. Ich denke, dass es für mich im Allgemeinen sehr nützlich sein wird. Für meine Zwecke werde ich jedoch eine Schleife verwenden und eine Funktion namens ListFind() als Ray verwenden. Ich denke deine UDF ist großartig, aber in dieser Situation ist es ein bisschen übertrieben. Danke für die Demo! – Mohamad

+0

Keine Sorge. Aber, ich habe Ihre Frage beantwortet :) –

+0

Sie tat, in der Tat :) – Mohamad

0

Die 2 Schleifen macht praktisch das gleiche, der einzige Unterschied ist, dass die Listen getauscht haben. Völlig unnötig. Sie müssen nur einen Weg prüfen; Alt -> Neu. NICHT anders herum auch (Old < - Neu).

Erstellen Sie eine Instanz der 2 Listen und senden Sie sie durch eine Schleife, wo Sie überprüfen, ob die alte Liste ein Element enthält, das einem der neuen Elemente entspricht.

Ich weiß nicht, wie gut eine For-Schleife für diesen Zweck ist, da local.i in der alten Liste index [7] sein kann und genau das gleiche Element, das Sie im neuen Index überprüfen müssen [3 ] nach möglichen Änderungen.

+0

Ziga, die Sache ist, muss ich die Elemente identifizieren, die hinzugefügt wurden (um sie zu erstellen), und die Elemente, die entfernt wurden, um sie zu löschen ... Ich kann nicht einen Weg vorstellen, dies ohne zu tun die zwei Schleifen ... – Mohamad

3

Die Antwort auf die richtigen Matches bekommen ist die ListFind() Funktion mit einem Trennzeichen zu verwenden, anstatt ListContains(): wird

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

Der Begrenzer ist notwendig, da sonst die Funktion versuchen, und die gesamte Zeichenfolge übereinstimmen.

Keine Antwort für das Refactoring, obwohl.

2

Haben Sie versucht, CFLib.org gesucht? Es gibt mehrere Listenfunktionen, darunter eine, um Unterschiede zu finden. Was Ihre Probleme mit Teilstrings betrifft, lesen Sie die Dokumentation zu ListContains. So soll es funktionieren. Versuchen Sie stattdessen ListFind oder ListFindNoCase.

3

Es gibt 3 Liste UDF auf cflib.org:

List Vergleich - http://cflib.org/udf/listCompare - Vergleicht man die Liste gegen eine andere, die Elemente in der ersten Liste zu finden, die in der zweiten Liste gibt es nicht. Führt die gleiche Funktion wie das gleichnamige benutzerdefinierte Tag aus.

Liste Diff - http://cflib.org/udf/ListDiff - Vergleicht zwei Listen und gibt die Elemente zurück, die nicht in beiden Listen enthalten sind.

Liste Diff Dup - http://cflib.org/udf/ListDiffDup - Diese Funktion vergleicht zwei Listen und gibt eine neue Liste zurück, die den Unterschied zwischen den beiden Eingabelisten enthält. Diese Funktion unterscheidet sich von ListDiff, da doppelte Elemente in den Listen als separate Elemente behandelt werden.

3

Im Ernst, erfinden Sie das Rad nicht neu. Verwenden Sie Java-Listen oder Sets, läuft Coldfusion auf einer JVM:

<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> 

Als Bonus here's a link to Java code I drew my example from.

+0

Ich muss wirklich mit Java und Coldfusion zusammen arbeiten. Da ich wenig über Java weiß, ist die Aussicht, es benutzen zu müssen, etwas abträglich; Aber es scheint so einfach und mit Funktionalität geladen. – Mohamad

+1

Bruce Eckels ** Thinking in Java ** http://www.amazon.com/Thinking-Java-4th-Bruce-Eckel/dp/0131872486 ist ein großartiges Buch zum Erlernen der Sprache. Das beste ColdFusion -> Java-Buch, das mir bekannt ist, ist Java für ColdFusion-Entwickler ** 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> 

Damit kann ich nach dem Element suchen, um zu sehen, ob es in der Liste ist oder nicht und ebenfalls zeigen, dass das Element fehlt.

Verwandte Themen