ColdFusion - Что эффективный путь состоит в том, чтобы искать массив структур?

  1. Вы (почти всегда) не должны использовать def внутри другого def или defn. Использование def является глобальным объявлением, и оно должно (почти) всегда стоять отдельно в исходном файле.
  2. См. Clojure for Brave & amp; Правда для вступления онлайн или многих хороших книг, таких как Getting Clojure.

    1. Вы забыли про парены вокруг case:

    Пример:

    (case args ...)
    
    1. Использование case действительно специальная функция, предназначенная в первую очередь для Java-объект взаимодействует и имеет некоторые серьезные ограничения (так называемые «оптимизации»). ИМХО почти всегда лучше использовать cond.

    Пример:

    (cond
      (= :set-name args)   (person (first args) age)
      (= :set-age  args)   (person age)
      ...)
    

    Обновление

    Одна из проблем с case заключается в том, что он должен быть литералом времени компиляции ]. Тем не менее, это не очевидно, и нет никакого предупреждения, если вы пытаетесь использовать что-то, что не соответствует определению. Тогда вы просто получаете молчаливый сбой. Этот пример выглядит так, как будто он должен вернуть "my vec", но он терпит неудачу & amp; возвращает "default":

    ; "The test-constants are not evaluated.  They must be compile-time
    ; literals, and need not be quoted." 
    (let [myvec [1 2]]
      (case myvec
        []             "empty vec"
        (vec '(1 2))   "my vec"
        "default"))
    ;=> "default"
    

    Таким образом, использование case оставляет ловушку-ловушку, готовую взломать ваш код без предупреждения.

13
задан Shawn Holmes 19 January 2012 в 15:12
поделиться

4 ответа

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

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

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

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

11
ответ дан 1 December 2019 в 23:48
поделиться

Without looking at it too deeply, I would consider converting the structure to a query (below) and then doing do a query of a query.. assuming your dataset isn't too huge!

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

Do share what you ended up doing!

Edit: The StructFindValue suggested looks to be excellent as well, I didn't think to look up any relevant functions.

1
ответ дан 1 December 2019 в 23:48
поделиться

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>
0
ответ дан 1 December 2019 в 23:48
поделиться