Como você pode testar para ver se duas matrizes são as mesmas usando o CFML?

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

  •  09-06-2019
  •  | 
  •  

Pergunta

Usando CFML (ColdFusion Markup Language, aka ColdFusion), como você pode comparar se duas matrizes de dimensão são os mesmos?

Foi útil?

Solução

Supondo que todos os valores na matriz são valores simples, a coisa mais fácil pode ser para converter as matrizes e listas de apenas fazer string compara.

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

Não é elegante como outras soluções oferecidas, mas é morto simples.

Outras dicas

Há uma maneira muito simples de comparação de duas matrizes usando CFML subjacente java.De acordo com um recente blog por Rupesh Kumar, da Adobe (http://coldfused.blogspot.com/), ColdFusion matrizes são uma implementação de java (listas de java.util.A lista).Então tudo o Java lista de métodos disponíveis para CFML matrizes.

Para comparar 2 matrizes de tudo o que você precisa fazer é usar o método de equals.Ele retorna um 'SIM', se as matrizes são iguais e NÃO se eles não são.

<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 construir James resposta, eu pensei que o JSON pode ser preferrable sobre WDDX.Na verdade, ele prova ser consideravelmente mais eficiente.Comparando-se os hashes não é caro, mas serializar os dados e, em seguida, gerar o hash pode ser (maiores e/ou mais complexas estruturas de dados).

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

Eis a saída que o código acima gera na minha máquina:

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

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

Enquanto a estrutura de dados que eu estou serialização é bastante complexo, ele poderia facilmente ser considerado pequeno.Isto deve fazer a eficiência de serialização JSON sobre WDDX ainda mais preferrable.

De qualquer forma, se eu fosse tentar escrever um "compareAnything" método usando hash comparação, gostaria de usar serialização JSON sobre WDDX.

O arrayCompare() função definida pelo usuário em cflib deve fazê-lo http://cflib.org/index.cfm?event=page.udfbyid&udfid=1210

Bacanas resposta é certamente o melhor, mas algo que eu tenho feito é realizado um hash de comparação em objetos que foram serialised para WDDX.

Este método é útil apenas relativamente pequenas matrizes, mas é uma outra opção, se você quiser mantê-lo puramente CFML.Ele também tem a vantagem que você pode aplicar o método para outros tipos de dados também...

Editar:Adams totalmente para a direita (como você pode ver a partir de seus números) - JSON é muito mais econômico, não só nessa situação, mas para a serialização em geral.Em minha defesa eu estou preso usando o CFMX 6.1 que não tem inerente JSON funções, e estava tentando evitar externo libs.

Eu estava olhando para utilizar CF nativo do Java, os objetos de algum tempo atrás e essa pergunta me fez lembrar de alguns posts que eu tinha marcado, como resultado da minha pesquisa.

ColdFusion matriz, na verdade, é uma implementação do java (lista de java.util.A lista).Assim, toda a lista de métodos que são realmente disponível para a Matriz.CF fornece a maior parte da funcionalidade de lista usando a Matriz de funções, mas existem algumas coisas que possível com java lista, que você não pode fazer diretamente com a CF funções.

  1. Mesclagem de duas matrizes
  2. Acrescentar uma matriz no meio de outra matriz
  3. Busca por um elemento em uma matriz
  4. Procurar matriz 1 para ver se a matriz 2 elementos são encontrados todos os
  5. Verificação de igualdade de
  6. Remova elementos na matriz 1 da matriz 2

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

Outro recurso que encontrei mostra como você pode usar o nativo de Java a classe de Matriz para obter valores exclusivos e criar personalizado classifica as funções em caso de necessidade de classificar uma matriz de datas, por exemplo.

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

Este segundo link contém links para outros postos de trabalho, onde o autor mostra como utilizar outras classes de Java nativamente para obter a funcionalidade ou a velocidade sobre a CF funções.

Todas essas soluções se verificar que duas matrizes são iguais.Eles não verificar que eles são o mesmo objeto.A única maneira que eu sei fazer que o nativo da CF é para alterar o objeto, de alguma forma, e ver se as duas referências a mudança.

Eu também acho que você deve estar atento a depender CF execução de determinadas classes java ou expondo métodos.Estes estão sujeitos a alterações.

Como para a comparação de duas matrizes para ver se o conteúdo é o mesmo, porque não basta Verifique se o comprimento (se diferente return false) Se os comprimentos são as mesmas de 1 a matriz len e verificar os elementos são os mesmos pausa e retornar false se eles não são.

Isto irá funcionar para valores simples.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top