Как с помощью CFML проверить, совпадают ли два массива?

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

  •  09-06-2019
  •  | 
  •  

Вопрос

Используя CFML (язык разметки ColdFusion, также известный как ColdFusion), как вы можете сравнить, являются ли два одномерных массива одинаковыми?

Это было полезно?

Решение

Если предположить, что все значения в массиве являются простыми значениями, проще всего преобразовать массивы в списки и просто выполнить сравнение строк.

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

Не так элегантно, как другие предлагаемые решения, но очень просто.

Другие советы

Существует очень простой способ сравнения двух массивов с использованием базовой библиотеки Java CFML.Согласно недавнему блогу Рупеша Кумара из Adobe (http://coldfused.blogspot.com/), Массивы ColdFusion представляют собой реализацию списков Java (java.util.List).Таким образом, все методы списков Java доступны для массивов CFML.

Итак, чтобы сравнить два массива, все, что вам нужно сделать, это использовать метод равенства.Он возвращает ДА, если массивы равны, и НЕТ, если нет.

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

Опираясь на ответ Джеймса, я подумал, что JSON может быть предпочтительнее WDDX.На самом деле это оказывается значительно эффективнее.Сравнение хешей не так уж и дорого, но может потребоваться сериализация данных и последующая генерация хеша (для более крупных и/или более сложных структур данных).

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

Вот результат, который генерирует приведенный выше код на моей машине:

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

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

Хотя структура данных, которую я сериализую, довольно сложна, ее легко можно считать небольшой.Это должно сделать эффективность сериализации JSON через WDDX еще более предпочтительной.

В любом случае, если бы я попытался написать метод «compareAnything», используя сравнение хешей, я бы использовал сериализацию JSON через WDDX.

Пользовательская функция arrayCompare() в cflib должна это сделать.http://cflib.org/index.cfm?event=page.udfbyid&udfid=1210

Ответ Джейсона, безусловно, лучший, но то, что я делал раньше, выполнял сравнение хешей объектов, сериализованных в WDDX.

Этот метод полезен только для относительно небольших массивов, но это еще один вариант, если вы хотите сохранить его исключительно в формате CFML.Преимущество этого также заключается в том, что вы можете применять этот метод и к другим типам данных...

Редактировать:Адамс совершенно прав (как видно из его цифр) — JSON гораздо экономичнее не только в этой ситуации, но и для сериализации в целом.В свою защиту я застрял в использовании CFMX 6.1, в котором нет встроенных функций JSON, и я пытался избегать внешних библиотек.

Некоторое время назад я изучал возможность использования собственных Java-объектов CF, и этот вопрос напомнил мне несколько сообщений в блоге, которые я добавил в закладки в результате поиска.

Массив ColdFusion на самом деле является реализацией списка Java (java.util.List).Таким образом, все методы списка фактически доступны для Array.CF обеспечивает большую часть функций списка с использованием функций массива, но со списком Java возможно несколько вещей, которые вы не можете сделать напрямую с функциями CF.

  1. Объединить два массива
  2. Добавить массив в середину другого массива
  3. Поиск элемента в массиве
  4. Найдите массив 1, чтобы увидеть, все ли элементы массива 2 найдены.
  5. Проверка равенства
  6. Удалить элементы массива 1 из массива 2

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

Другой ресурс, который я нашел, показывает, как вы можете использовать собственный класс Java Array для получения уникальных значений и создания пользовательских функций сортировки, например, в случае, если вам нужно отсортировать массив дат.

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

Эта вторая ссылка содержит ссылки на другие публикации, где автор показывает, как использовать другие классы Java в исходном виде, чтобы получить либо функциональность, либо скорость по сравнению с функциями CF.

Все эти решения проверяют равенство двух массивов.Они не проверяют, являются ли они одним и тем же объектом.Единственный известный мне способ сделать это в собственном CF — каким-либо образом изменить объект и посмотреть, есть ли изменения в обеих ссылках.

Я также думаю, что вам следует с осторожностью полагаться на то, что CF реализует определенные классы Java или предоставляет методы.Они могут измениться.

Что касается сравнения двух массивов, чтобы увидеть, является ли содержимое одинаковым, почему бы просто не проверить длину (если другой возврат false), если длина одинакова от 1 до массива len и проверить, что элементы одинаковы и возвращайте ложные, если они не.

Это будет работать для простых значений.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top