Comment pouvez-vous tester si deux tableaux sont identiques à l’aide de CFML ?

StackOverflow https://stackoverflow.com/questions/30288

  •  09-06-2019
  •  | 
  •  

Question

En utilisant CFML (ColdFusion Markup Langauge, alias ColdFusion), comment pouvez-vous comparer si deux tableaux unidimensionnels sont identiques ?

Était-ce utile?

La solution

En supposant que toutes les valeurs du tableau sont des valeurs simples, le plus simple pourrait être de convertir les tableaux en listes et d'effectuer simplement des comparaisons de chaînes.

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

Pas aussi élégant que les autres solutions proposées, mais très simple.

Autres conseils

Il existe un moyen très simple de comparer deux tableaux en utilisant le Java sous-jacent de CFML.Selon un blog récent de Rupesh Kumar d'Adobe (http://coldfused.blogspot.com/), les tableaux ColdFusion sont une implémentation de listes Java (java.util.List).Ainsi, toutes les méthodes de liste Java sont disponibles pour les tableaux CFML.

Donc, pour comparer 2 tableaux, tout ce que vous avez à faire est d’utiliser la méthode égale.Il renvoie OUI si les tableaux sont égaux et NON s'ils ne le sont pas.

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

Pour m'appuyer sur la réponse de James, j'ai pensé que JSON pourrait être préférable à WDDX.En fait, cela s’avère considérablement plus efficace.Comparer les hachages n'est pas si coûteux, mais sérialiser les données puis générer le hachage pourrait l'être (pour des structures de données plus grandes et/ou plus complexes).

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

Voici le résultat généré par le code ci-dessus sur ma machine :

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

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

Bien que la structure de données que je sérialise soit assez complexe, elle pourrait facilement être considérée comme petite.Cela devrait rendre l'efficacité de la sérialisation JSON par rapport à WDDX encore plus préférable.

Quoi qu'il en soit, si je devais essayer d'écrire une méthode "compareAnything" en utilisant la comparaison de hachage, j'utiliserais la sérialisation JSON sur WDDX.

La fonction définie par l'utilisateur arrayCompare() sur cflib devrait le fairehttp://cflib.org/index.cfm?event=page.udfbyid&udfid=1210

La réponse de Jason est certainement la meilleure, mais quelque chose que j'ai déjà fait consiste à effectuer une comparaison de hachage sur des objets qui ont été sérialisés dans WDDX.

Cette méthode n'est utile que pour les tableaux relativement petits, mais c'est une autre option si vous souhaitez la conserver purement CFML.Cela présente également l'avantage de pouvoir appliquer la méthode à d'autres types de données également...

Modifier:Adams a tout à fait raison (comme vous pouvez le voir d'après ses chiffres) : JSON est beaucoup plus économique, non seulement dans cette situation, mais pour la sérialisation en général.Pour ma défense, je suis coincé avec CFMX 6.1 qui n'a pas de fonctions JSON intégrées et j'essayais d'éviter les bibliothèques externes.

Il y a quelque temps, je cherchais à utiliser les objets Java natifs de CF et cette question m'a rappelé quelques articles de blog que j'avais mis en favoris à la suite de ma recherche.

Le tableau ColdFusion est en fait une implémentation de liste Java (java.util.List).Ainsi, toutes les méthodes de liste sont réellement disponibles pour Array.CF fournit la plupart des fonctionnalités de liste à l'aide des fonctions Array, mais il y a peu de choses possibles avec la liste Java que vous ne pouvez pas faire directement avec les fonctions CF.

  1. Fusionner deux tableaux
  2. Ajouter un tableau au milieu d'un autre tableau
  3. Rechercher un élément dans un tableau
  4. Recherchez le tableau 1 pour voir si les éléments du tableau 2 sont tous trouvés
  5. Contrôle d'égalité
  6. Supprimer les éléments du tableau 1 du tableau 2

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

Une autre ressource que j'ai trouvée montre comment utiliser la classe Java Array native pour obtenir des valeurs uniques et créer des fonctions de tri personnalisées au cas où vous auriez besoin de trier un tableau de dates, par exemple.

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

Ce deuxième lien contient des liens vers d'autres articles dans lesquels l'auteur montre comment utiliser d'autres classes Java de manière native pour obtenir des fonctionnalités ou de la vitesse sur les fonctions CF.

Toutes ces solutions vérifient que deux tableaux sont égaux.Ils ne vérifient pas qu'il s'agit bien du même objet.La seule façon que je connaisse de le faire dans CF natif est de modifier l'objet d'une manière ou d'une autre et de voir si les deux références contiennent le changement.

Je pense également que vous devriez vous méfier de compter sur CF pour implémenter certaines classes Java ou exposer des méthodes.Ceux-ci sont susceptibles de changer.

En ce qui concerne la comparaison de deux tableaux pour voir si le contenu est le même, pourquoi ne pas simplement vérifier la longueur (si un retour différent faux) si les longueurs sont les mêmes de 1 à un tableau Len et vérifiez les éléments ne sont pas.

Cela fonctionnera pour des valeurs simples.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top