2009-05-14 25 views
12

ColdFusion'da yarı büyük (yüzlerce kayıt) 1 boyutlu dizilim var. Dizideki her öğe, çeşitli özelliklere sahip bir yapıdır. Belirli bir "name" özelliğine sahip bir struct için diziyi aramak istiyorum. Ben dize değerler dizisi için ben şöyle Java yöntemleri kullanabilirsiniz biliyor:ColdFusion - Bir dizi yapıyı aramak için verimli bir yol nedir?

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

... ama bu yapılar bir dizi için çalışmaz.

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

... ama daha verimli bir yolu olmalı gibi hissediyorum: Ben de bunu böyle kaba kuvvet biliyorum. Bundan daha iyi bir çözümü olan var mı? "Struct" özelliğinin her yapıda mevcut olduğunu ve dizide boşluk veya başka nesnelerin olmadığını varsayabilirsiniz.

cevap

11

sen dizi inşa olarak oluştururken bir karma tablo yoksa, ı don Gönderdiğiniz O (n) çözümden daha hızlı bir arama işlevi oluşturacağınızı göreceksiniz.

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

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

Bu değer her zaman var olduğunu varsayar: Eğer dizileri inşa ederken Neyse, böyle bir şey yapabilirdi. Aramayı yapmadan önce StructKeyExists (nameValues, "WhatImLookingFor") kontrol etmeniz gerekebilir.

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

O belgelenen, ama işe yarıyor: CF 10 veya Railo 4'te

+0

Bu iyi bir fikir! Bunu gelecekte de kullanacağım. –

0

CFGroovy FTW! :)

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

ya .. Eğer daha java tarzı gibi eğer (ağırlık/kapanması o)

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

Bu çözüm, soruda yayınlanan orijinal algoritmadan daha iyi midir? Groovy (veya CFGroovy) hakkında henüz iyi okumadım, ama * aynı algoritmayı başka bir dilde yeniden yazdığınız gibi. Değeri için, bu biraz daha okunaklı, ve tartışmalı olarak daha zarif ... ama daha hızlı olma şansı (muhtemelen) ince-bir-olmayan, çalıştırmak için Groovy dışarı çıkmak ve CF'ye geri dönmek zorunda olduğu düşünülürse. Groovy'de muazzam bir hızla daha hızlı olsaydı, o zaman yükün buna değer olması muhtemeldir, ama şüphem var. –

5

, kullanabilirsiniz! Tüm endeksleri istiyorsanız ArrayFindAll() da bir seçenektir.

+0

Bu yeni işlev sınıfı harika. – rhinds

İlgili konular