ColdFusion - Какой эффективный способ поиска по массиву структур? - PullRequest
13 голосов
/ 15 мая 2009

В ColdFusion у меня есть полуразмерный (сотни записей) одномерный массив. Каждый элемент в массиве является структурой с несколькими свойствами. Я хочу найти массив для структуры, которая имеет определенное свойство "имя". Я знаю, что для массива строковых значений я мог бы использовать методы Java, например, так:

<cfset arrayIndex = myArray.indexOf("WhatImLookingFor") + 1>

... но это не сработает для массива структур. Я также знаю, что мог бы грубо заставить это так:

<cfset arrayIndex = 0>
<cfloop from="1" to="#ArrayLen(myArray)#" index="counter">
    <cfif myArray[counter].name IS "WhatImLookingFor">
        <cfset arrayIndex = counter>
    </cfif>
</cfloop>

... но я чувствую, что должен быть более эффективный способ. У кого-нибудь есть лучшее решение, чем это? Можно предположить, что свойство «name» присутствует в каждой структуре, и в массиве нет пробелов или других объектов.

Ответы [ 5 ]

11 голосов
/ 15 мая 2009

Если у вас нет хеш-таблицы, которую вы создаете при создании массива, я не понимаю, как вы собираетесь создать функцию поиска, которая быстрее, чем решение O (n), которое вы опубликовали. В любом случае, пока вы строите свои массивы, вы можете сделать что-то вроде этого:

<cfloop query="qryValues">
    <cfset nameValues[name] = currentrow />
    <cfset myArray[currentrow].name = name />
</cfloop>

<cfset arrayIndex = nameValues["WhatImLookingFor"] />

Предполагается, что значение всегда существует. Возможно, вам придется проверить StructKeyExists (nameValues, "WhatImLookingFor") перед выполнением вызова.

6 голосов
/ 07 июля 2012

В CF 10 или Railo 4 вы можете использовать:

arrayIndex = ArrayFind(arrayOfStructs, function(struct){ 
   return struct.name == "WhatImLookingFor"; 
});

Это не задокументировано, но работает! ArrayFindAll () также является опцией, если вам нужны все индексы.

1 голос
/ 15 мая 2009

Не глядя на это слишком глубоко, я хотел бы рассмотреть преобразование структуры в запрос (ниже), а затем выполнить запрос запроса ... при условии, что ваш набор данных не слишком велик!

http://www.bennadel.com/blog/264-Ask-Ben-Converting-A-Struct-To-A-Query-And-More-Java-.htm

Делись тем, что ты в итоге делал!

Edit: StructFindValue также выглядит превосходно, я не думал искать какие-либо соответствующие функции.

0 голосов
/ 15 мая 2009

CFGroovy FTW! :)

<cfset count = 0>
<g:script>
count = myArray.find({ 
  it["NAME"] == "WhatImLookingFor" }
})
</g:script>

или .. если вам нравится более Java-стиль (без закрытия)

<cfset count = 0>
<g:script>
for (i in myArray) {
  if( i["NAME"] == "WhatImLookingFor" )
    count++
}
</g:script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...