2009-05-14 20 views
12

Mam pół-dużą (setki rekordów) jednowymiarową tablicę w ColdFusion. Każdy element w tablicy jest strukturą z kilkoma właściwościami. Chcę przeszukać tablicę pod kątem struktury, która ma określoną właściwość "nazwa". Wiem, że na tablicy ciągów znaków można używać metody Java tak:ColdFusion - Jaki jest skuteczny sposób wyszukiwania tablicy struktur?

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

... ale to nie zadziała dla tablicy kodowanym. Wiem też, że mogę zmusić go do brutalnego wymuszenia:

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

... ale wydaje mi się, że musi istnieć skuteczniejszy sposób. Czy ktoś ma lepsze rozwiązanie niż to? Można założyć, że właściwość "nazwa" jest obecna w każdej strukturze i nie ma żadnych przerw ani innych obiektów w tablicy.

Odpowiedz

11

Jeśli nie masz tabeli mieszania jesteś tworzenie jak zbudować tablicę, I don zobacz, jak zamierzasz utworzyć funkcję wyszukiwania, która jest szybsza od zamieszczonego przez ciebie rozwiązania O (n). W każdym razie, podczas budowania tablic, możesz zrobić coś takiego:

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

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

Zakłada się, że wartość zawsze istnieje. Przed wykonaniem połączenia może zajść potrzeba sprawdzenia StructKeyExists (nameValues, "WhatImLookingFor").

+0

To dobry pomysł! Wykorzystam to w przyszłości. –

1

Nie patrząc na nią zbyt głęboko, chciałbym rozważyć przekształcenie struktury do zapytania (poniżej), a następnie robi zrobić zapytanie o zapytanie .. zakładając, że twój zestaw danych nie jest zbyt duży!

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

Czy dzielić co skończyło się robi!

Edycja: Sugerowany wygląd StructFindValue wygląda równie dobrze, nie myślałem o wyszukaniu żadnych istotnych funkcji.

0

CFGroovy FTW! :)

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

lub .. jeśli chcesz więcej stylu java (w/o zamknięciu)

<cfset count = 0> 
<g:script> 
for (i in myArray) { 
    if(i["NAME"] == "WhatImLookingFor") 
    count++ 
} 
</g:script> 
+1

Czy to rozwiązanie jest lepsze niż oryginalny algorytm zamieszczony w pytaniu? Nie jestem jeszcze dobrze czytany na Groovy (lub CFGroovy), ale * wygląda * tak, jakbyś właśnie napisał ten sam algorytm w innym języku. Co jest tego warte, jest nieco bardziej czytelne i prawdopodobnie bardziej eleganckie ... ale szanse na bycie szybszym są (prawdopodobnie) niewielkie, ponieważ muszą wyruszyć do Groovy, aby uciec i wrócić do CF. Przypuszczam, że jeśli jest niesamowicie szybszy w Groovy, to jest możliwe, że koszty są tego warte, ale wątpię w to. –

5

W CF 10 lub Railo 4, można użyć:

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

To nie jest udokumentowany, ale to działa! ArrayFindAll() jest również opcją, jeśli chcesz wszystkie indeksy.

+0

Ta klasa nowych funkcji jest świetna. – rhinds

Powiązane problemy