Frage

Wie können Sie mit CFML (ColdFusion Markup Langauge, auch bekannt als ColdFusion) vergleichen, ob zwei eindimensionale Arrays gleich sind?

War es hilfreich?

Lösung

Unter der Annahme, dass alle Werte im Array einfache Werte sind, könnte es am einfachsten sein, die Arrays in Listen umzuwandeln und einfach String-Vergleiche durchzuführen.

<cfif arrayToList(arrayA) IS arrayToList(arrayB)>
    Arrays are equal!
</cfif>

Nicht so elegant wie andere angebotene Lösungen, aber absolut einfach.

Andere Tipps

Es gibt eine sehr einfache Möglichkeit, zwei Arrays mithilfe des zugrunde liegenden Java von CFML zu vergleichen.Laut einem aktuellen Blog von Rupesh Kumar von Adobe (http://coldfused.blogspot.com/), ColdFusion-Arrays sind eine Implementierung von Java-Listen (java.util.List).Daher sind alle Java-Listenmethoden für CFML-Arrays verfügbar.

Um also zwei Arrays zu vergleichen, müssen Sie lediglich die Methode „equals“ verwenden.Es gibt ein JA zurück, wenn die Arrays gleich sind, und NEIN, wenn dies nicht der Fall ist.

<cfset array1 = listToArray("tom,dick,harry,phred")/>
<cfset array2 = listToArray("dick,harry,phred") />
<cfset array3 = listToArray("tom,dick,harry,phred")/>

<cfoutput>
Array2 equals Array1 #array2.equals(array1)# (returns a NO) <br/>
Array3 equals Array1 #array3.equals(array1)# (returns a YES) <br/>
</cfoutput>

Um auf James‘ Antwort aufzubauen, dachte ich, dass JSON WDDX vorzuziehen sein könnte.Tatsächlich erweist es sich als wesentlich effizienter.Der Vergleich von Hashes ist nicht so teuer, aber die Serialisierung der Daten und die anschließende Generierung des Hashes könnten es sein (für größere und/oder komplexere Datenstrukturen).

<cfsilent>
    <!--- create some semi-complex test data --->
    <cfset data = StructNew() />
    <cfloop from="1" to="50" index="i">
        <cfif variables.i mod 2 eq 0>
            <cfset variables.data[variables.i] = StructNew()/>
            <cfset tmp = variables.data[variables.i] />
            <cfloop from="1" to="#variables.i#" index="j">
                <cfset variables.tmp[variables.j] = 1 - variables.j />
            </cfloop>
        <cfelseif variables.i mod 3 eq 0>
            <cfset variables.data[variables.i] = ArrayNew(1)/>
            <cfset tmp = variables.data[variables.i] />
            <cfloop from="1" to="#variables.i#" index="j">
                <cfset variables.tmp[variables.j] = variables.j mod 6 />
            </cfloop>
            <cfset variables.data[variables.i] = variables.tmp />
        <cfelse>
            <cfset variables.data[variables.i] = variables.i />
        </cfif>
    </cfloop>
</cfsilent>

<cftimer label="JSON" type="inline">
    <cfset jsonData = serializeJson(variables.data) />
    <cfset jsonHash = hash(variables.jsonData) />
    <cfoutput>
        JSON: done.<br />
        len=#len(variables.jsonData)#<br/>
        hash=#variables.jsonHash#<br />
    </cfoutput>
</cftimer>
<br/><br/>
<cftimer label="WDDX" type="inline">
    <cfwddx action="cfml2wddx" input="#variables.data#" output="wddx" />
    <cfset wddxHash = hash(variables.wddx) />
    <cfoutput>
        WDDX: done.<br />
        len=#len(variables.wddx)#<br/>
        hash=#variables.wddxHash#<br />
    </cfoutput>
</cftimer>

Hier ist die Ausgabe, die der obige Code auf meinem Computer generiert:

JSON: done.
len=7460
hash=5D0DC87FDF68ACA4F74F742528545B12
JSON: 0ms

WDDX: done.
len=33438
hash=94D9B792546A4B1F2FAF9C04FE6A00E1
WDDX: 47ms

Obwohl die Datenstruktur, die ich serialisiere, ziemlich komplex ist, könnte man sie leicht als klein bezeichnen.Dies sollte die Effizienz der JSON-Serialisierung gegenüber WDDX noch vorteilhafter machen.

Wenn ich jedenfalls versuchen würde, eine „compareAnything“-Methode mit Hash-Vergleich zu schreiben, würde ich die JSON-Serialisierung über WDDX verwenden.

Die benutzerdefinierte Funktion arrayCompare() in cflib sollte dies tunhttp://cflib.org/index.cfm?event=page.udfbyid&udfid=1210

Jasons Antwort ist sicherlich die beste, aber ich habe bereits einen Hash-Vergleich für Objekte durchgeführt, die in WDDX serialisiert wurden.

Diese Methode ist nur für relativ kleine Arrays nützlich, sie ist jedoch eine weitere Option, wenn Sie sie als reines CFML beibehalten möchten.Es hat auch den Vorteil, dass Sie die Methode auch auf andere Datentypen anwenden können ...

Bearbeiten:Adams hat völlig recht (wie Sie an seinen Zahlen sehen können): JSON ist viel wirtschaftlicher, nicht nur in dieser Situation, sondern für die Serialisierung im Allgemeinen.Zu meiner Verteidigung muss ich sagen, dass ich CFMX 6.1 verwende, das über keine integrierten JSON-Funktionen verfügt, und versucht habe, externe Bibliotheken zu vermeiden.

Ich habe vor einiger Zeit über die Verwendung der nativen Java-Objekte von CF nachgedacht und diese Frage erinnerte mich an einige Blog-Beiträge, die ich aufgrund meiner Suche in meinen Lesezeichen gespeichert hatte.

Das ColdFusion-Array ist eigentlich eine Implementierung der Java-Liste (java.util.List).Für Array sind also tatsächlich alle Listenmethoden verfügbar.CF stellt die meisten Listenfunktionen mithilfe von Array-Funktionen bereit, aber mit Java-Listen sind nur wenige Dinge möglich, die Sie nicht direkt mit CF-Funktionen ausführen können.

  1. Zwei Arrays zusammenführen
  2. Hängen Sie ein Array in der Mitte eines anderen Arrays an
  3. Suchen Sie nach einem Element in einem Array
  4. Durchsuchen Sie Array 1, um zu sehen, ob alle Elemente von Array 2 gefunden werden
  5. Gleichheitsprüfung
  6. Elemente in Array 1 aus Array 2 entfernen

Aus: http://coldfused.blogspot.com/2007/01/extend-cf-native-objects-harnessing.html

Eine andere Ressource, die ich gefunden habe, zeigt, wie Sie die native Java-Array-Klasse verwenden können, um eindeutige Werte abzurufen und benutzerdefinierte Sortierfunktionen zu erstellen, falls Sie beispielsweise ein Array von Datumsangaben sortieren müssen.

http://www.barneyb.com/barneyblog/2008/05/08/use-coldfusion-use-java/

Dieser zweite Link enthält Links zu anderen Beiträgen, in denen der Autor zeigt, wie man andere Java-Klassen nativ verwendet, um entweder Funktionalität oder Geschwindigkeit gegenüber CF-Funktionen zu gewinnen.

Alle diese Lösungen prüfen, ob zwei Arrays gleich sind.Sie überprüfen nicht, ob es sich um dasselbe Objekt handelt.Die einzige mir bekannte Möglichkeit, dies in nativer CF zu tun, besteht darin, das Objekt auf irgendeine Weise zu ändern und zu prüfen, ob beide Referenzen die Änderung enthalten.

Ich denke auch, dass Sie sich davor hüten sollten, sich darauf zu verlassen, dass CF bestimmte Java-Klassen implementiert oder Methoden offenlegt.Diese können sich ändern.

Wie beim Vergleich von zwei Arrays, um festzustellen, ob der Inhalt gleich ist, überprüfen Sie einfach die Länge (wenn unterschiedliche Rückgabe falsch). Wenn die Längen von 1 bis Array Len gleich sind und die Elemente derselbe Pause sind und falsch zurückgeben, wenn sie sind nicht.

Dies funktioniert für einfache Werte.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top