¿Cómo se puede probar para ver si dos matrices son iguales usando CFML?

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

  •  09-06-2019
  •  | 
  •  

Pregunta

Usando CFML (ColdFusion Markup Langauge, también conocido como ColdFusion), ¿cómo se puede comparar si dos matrices de una sola dimensión son iguales?

¿Fue útil?

Solución

Suponiendo que todos los valores de la matriz sean valores simples, lo más fácil podría ser convertir las matrices en listas y simplemente hacer comparaciones de cadenas.

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

No es tan elegante como otras soluciones ofrecidas, pero es muy simple.

Otros consejos

Existe una forma muy sencilla de comparar dos matrices utilizando el Java subyacente de CFML.Según un blog reciente de Rupesh Kumar de Adobe (http://coldfused.blogspot.com/), las matrices ColdFusion son una implementación de listas java (java.util.List).Entonces, todos los métodos de lista de Java están disponibles para matrices CFML.

Entonces, para comparar 2 matrices, todo lo que necesitas hacer es usar el método igual.Devuelve SÍ si las matrices son iguales y NO si no lo son.

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

Para aprovechar la respuesta de James, pensé que JSON podría ser preferible a WDDX.De hecho, demuestra ser considerablemente más eficiente.Comparar hashes no es tan costoso, pero serializar los datos y luego generar el hash podría serlo (para estructuras de datos más grandes y/o más complejas).

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

Aquí está el resultado que genera el código anterior en mi máquina:

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

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

Si bien la estructura de datos que estoy serializando es bastante compleja, fácilmente podría considerarse pequeña.Esto debería hacer que la eficiencia de la serialización JSON sobre WDDX sea aún más preferible.

En cualquier caso, si intentara escribir un método "compareAnything" usando comparación hash, usaría la serialización JSON sobre WDDX.

La función definida por el usuario arrayCompare() en cflib debería hacerlohttp://cflib.org/index.cfm?event=page.udfbyid&udfid=1210

La respuesta de Jason es sin duda la mejor, pero algo que he hecho antes es realizar una comparación hash de objetos que se han serializado en WDDX.

Este método sólo es útil para matrices relativamente pequeñas, pero es otra opción si desea mantenerlo exclusivamente CFML.También tiene la ventaja de que puedes aplicar el método a otros tipos de datos también...

Editar:Adams tiene toda la razón (como se puede ver en sus números): JSON es mucho más económico, no solo en esta situación, sino también para la serialización en general.En mi defensa, estoy atrapado usando CFMX 6.1 que no tiene funciones JSON incorporadas y estaba tratando de evitar bibliotecas externas.

Hace un tiempo estuve investigando el uso de objetos Java nativos de CF y esta pregunta me recordó algunas publicaciones de blog que había marcado como resultado de mi búsqueda.

La matriz ColdFusion es en realidad una implementación de la lista Java (java.util.List).Entonces, todos los métodos de lista están realmente disponibles para Array.CF proporciona la mayor parte de la funcionalidad de la lista utilizando funciones de matriz, pero hay algunas cosas posibles con la lista de Java que no se pueden hacer directamente con las funciones de CF.

  1. Fusionar dos matrices
  2. Agregar una matriz en medio de otra matriz
  3. Buscar un elemento en una matriz
  4. Busque en la matriz 1 para ver si se encuentran todos los elementos de la matriz 2
  5. control de igualdad
  6. Eliminar elementos en la matriz 1 de la matriz 2

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

Otro recurso que encontré muestra cómo se puede utilizar la clase nativa Java Array para obtener valores únicos y crear funciones de clasificación personalizadas en caso de que necesite ordenar una serie de fechas, por ejemplo.

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

Este segundo enlace contiene enlaces a otras publicaciones donde el autor muestra cómo usar otras clases de Java de forma nativa para obtener funcionalidad o velocidad sobre las funciones CF.

Todas estas soluciones verifican que dos matrices sean iguales.No comprueban que sean el mismo objeto.La única forma que conozco de hacerlo en CF nativo es cambiar el objeto de alguna manera y ver si ambas referencias tienen el cambio.

También creo que deberías tener cuidado de confiar en que CF implemente ciertas clases de Java o exponga métodos.Estos están sujetos a cambios.

En cuanto a la comparación de dos matrices para ver si el contenido es el mismo, ¿por qué no simplemente verificar la longitud (si diferente devuelve falso) si las longitudes son las mismas de 1 a la lista de la matriz y verifique que los elementos son el mismo descanso y devuelvan falsos si ellos no son.

Esto funcionará para valores simples.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top