Coldfusion - Hva er en effektiv måte å søke en rekke structs?

stemmer
12

Jeg har en semi-stor (flere hundre plater) 1-dimensjonal matrise i Coldfusion. Hvert element i matrisen er et struct med flere egenskaper. Jeg ønsker å søke på array for en struct som har en bestemt navn eiendom. Jeg vet at for en rekke strengverdier jeg kunne bruke Java-metoder slik:

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

... men det vil ikke fungere for en rekke structs. Jeg vet også at jeg kunne brute-force det slik:

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

... men jeg føler at det må være en mer effektiv måte. Har noen en bedre løsning enn dette? Du kan anta at navn eiendom er til stede i hver struct og det er ingen hull eller andre gjenstander i tabellen.

Publisert på 14/05/2009 klokken 20:39
kilden bruker
På andre språk...                            


5 svar

stemmer
11

Med mindre du har en hash table du lager som du bygger tabellen, ser jeg ikke hvordan du skal lage en søkefunksjon som er raskere enn O (n) løsning du har lagt ut. Uansett, mens du bygger dine arrays, kan du gjøre noe som dette:

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

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

Dette forutsetter at verdien alltid eksisterer. Du må kanskje sjekke StructKeyExists (nameValues, "WhatImLookingFor") før du ringer.

Svarte 15/05/2009 kl. 03:01
kilden bruker

stemmer
5

I CF 10 eller Railo 4, kan du bruke:

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

Det er ikke dokumentert, men det fungerer! ArrayFindAll () er også et alternativ hvis du vil at alle indeksene.

Svarte 06/07/2012 kl. 21:17
kilden bruker

stemmer
1

Uten å se på det for dypt, vil jeg vurdere å konvertere strukturen til en spørring (under) og deretter gjøre gjøre en spørring for en spørring .. forutsatt at datasettet ikke er for stor!

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

Må dele hva du endte opp med å gjøre!

Edit: Den StructFindValue foreslo ser ut til å være utmerket i tillegg, jeg trodde ikke å lete opp noen relevante funksjoner.

Svarte 14/05/2009 kl. 20:44
kilden bruker

stemmer
0

CFGroovy FTW! :)

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

eller .. hvis du liker en mer java stil (w / o nedleggelse)

<cfset count = 0>
<g:script>
for (i in myArray) {
  if( i["NAME"] == "WhatImLookingFor" )
    count++
}
</g:script>
Svarte 15/05/2009 kl. 02:33
kilden bruker


Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more