Domanda

Utilizzando CFML (ColdFusion Markup Langauge, alias ColdFusion), come puoi confrontare se due array a dimensione singola sono uguali?

È stato utile?

Soluzione

Supponendo che tutti i valori nell'array siano valori semplici, la cosa più semplice potrebbe essere convertire gli array in elenchi ed eseguire semplicemente confronti di stringhe.

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

Non elegante come le altre soluzioni offerte, ma semplicissimo.

Altri suggerimenti

Esiste un modo molto semplice per confrontare due array utilizzando Java.Secondo un recente blog di Rupesh Kumar di Adobe (http://coldfused.blogspot.com/), gli array ColdFusion sono un'implementazione degli elenchi Java (java.util.List).Pertanto tutti i metodi di elenco Java sono disponibili per gli array CFML.

Quindi per confrontare 2 array tutto ciò che devi fare è utilizzare il metodo uguale.Restituisce SI se gli array sono uguali e NO se non lo sono.

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

Per basarmi sulla risposta di James, ho pensato che JSON potesse essere preferibile rispetto a WDDX.In effetti, si rivela notevolmente più efficiente.Confrontare gli hash non è così costoso, ma serializzare i dati e quindi generare l'hash potrebbe esserlo (per strutture di dati più grandi e/o più complesse).

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

Ecco l'output generato dal codice precedente sulla mia macchina:

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

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

Sebbene la struttura dati che sto serializzando sia piuttosto complessa, potrebbe facilmente essere considerata piccola.Ciò dovrebbe rendere ancora più preferibile l'efficienza della serializzazione JSON su WDDX.

In ogni caso, se dovessi provare a scrivere un metodo "compareAnything" utilizzando il confronto hash, utilizzerei la serializzazione JSON su WDDX.

La funzione definita dall'utente arrayCompare() su cflib dovrebbe farlohttp://cflib.org/index.cfm?event=page.udfbyid&udfid=1210

La risposta di Jason è sicuramente la migliore, ma qualcosa che ho fatto prima è stato eseguito un confronto hash su oggetti che sono stati serializzati su WDDX.

Questo metodo è utile solo per array relativamente piccoli, ma è un'altra opzione se vuoi mantenerlo puramente CFML.Ha anche il vantaggio di poter applicare il metodo anche ad altri tipi di dati...

Modificare:Adams ha perfettamente ragione (come puoi vedere dai suoi numeri): JSON è molto più economico, non solo in questa situazione, ma per la serializzazione in generale.In mia difesa sono bloccato utilizzando CFMX 6.1 che non ha funzioni JSON integrate e stavo cercando di evitare librerie esterne.

Qualche tempo fa stavo cercando di utilizzare gli oggetti Java nativi di CF e questa domanda mi ha ricordato alcuni post del blog che avevo aggiunto ai segnalibri come risultato della mia ricerca.

L'array ColdFusion è in realtà un'implementazione dell'elenco Java (java.util.List).Quindi tutti i metodi dell'elenco sono effettivamente disponibili per Array.CF fornisce la maggior parte delle funzionalità dell'elenco utilizzando le funzioni Array ma ci sono alcune cose possibili con l'elenco Java che non puoi fare direttamente con le funzioni CF.

  1. Unisci due array
  2. Aggiungi un array al centro di un altro array
  3. Cerca un elemento in un array
  4. Cerca l'array 1 per vedere se gli elementi dell'array 2 sono stati trovati tutti
  5. Controllo di uguaglianza
  6. Rimuovi gli elementi nell'array 1 dall'array 2

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

Un'altra risorsa che ho trovato mostra come utilizzare la classe Java Array nativa per ottenere valori univoci e creare funzioni di ordinamento personalizzate nel caso in cui sia necessario ordinare un array di date, ad esempio.

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

Questo secondo collegamento contiene collegamenti ad altri post in cui l'autore mostra come utilizzare altre classi Java in modo nativo per ottenere funzionalità o velocità rispetto alle funzioni CF.

Tutte queste soluzioni verificano che due array siano uguali.Non controllano che siano lo stesso oggetto.L'unico modo che conosco per farlo nella CF nativa è modificare l'oggetto in qualche modo e vedere se entrambi i riferimenti presentano la modifica.

Penso anche che dovresti diffidare di fare affidamento su CF che implementa determinate classi Java o espone metodi.Questi sono soggetti a modifiche.

Per quanto riguarda il confronto di due array per vedere se il contenuto è lo stesso, perché non controllare solo la lunghezza (se restituisci diversi falsi) se le lunghezze sono le stesse da 1 all'array len e controlla gli elementi sono la stessa pausa e restituiscono false se loro non sono.

Funzionerà per valori semplici.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top