2009-05-14 10 views
12

मेरे पास कोल्डफ्यूजन में अर्ध-बड़े (सैकड़ों रिकॉर्ड) 1-आयामी सरणी है। सरणी में प्रत्येक आइटम कई गुणों के साथ एक संरचना है। मैं उस स्ट्रक्चर के लिए सरणी खोजना चाहता हूं जिसमें विशिष्ट "नाम" संपत्ति हो। मुझे पता है कि स्ट्रिंग मूल्यों की एक सरणी के लिए मैं बहुत तरह जावा तरीकों का उपयोग कर सकते हैं:कोल्डफ्यूजन - structs की सरणी खोजने के लिए एक प्रभावी तरीका क्या है?

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

... लेकिन यह है कि structs की एक सरणी के लिए काम नहीं करेगा। मैं भी जानता हूँ कि मैं कर सकता है तो वह ऐसा जानवर बल:

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

... लेकिन मुझे लगता है कि वहाँ एक और अधिक कुशल तरीके से किया जाना चाहिए। क्या किसी के पास इससे बेहतर समाधान है? आप मान सकते हैं कि "संरचना" संपत्ति प्रत्येक संरचना में मौजूद है और सरणी में कोई अंतर या अन्य वस्तुएं नहीं हैं।

उत्तर

11

जब तक आप एक हैश तालिका आप आप सरणी का निर्माण के रूप में बना रहे हैं, मैं डॉन यह नहीं देखता कि आप एक खोज फ़ंक्शन कैसे बना रहे हैं जो आपके द्वारा पोस्ट किए गए ओ (एन) समाधान से तेज़ है।

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

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

मतलब यह है कि मूल्य हमेशा मौजूद है: वैसे भी, जब आप अपने सरणियों निर्माण कर रहे हैं, तो आप इस तरह कुछ कर सकता है। कॉल करने से पहले आपको स्ट्रक्टेकीएक्सिस्ट्स (नाम वैल्यूज, "व्हाटआईएम लुकिंगफॉर") की जांच करने की आवश्यकता हो सकती है।

+0

यह एक अच्छा विचार है! मैं भविष्य में इसका उपयोग करूंगा। –

-1
+0

वह कुछ नहीं जिसे वह पूछ रहा है। – Henry

1

इसे बहुत गहराई से देख के बिना चाहते हैं, मैं (नीचे) एक सवाल के संरचना परिवर्तित करने पर विचार किया और फिर एक ऐसा कर रही हैं एक प्रश्न की क्वेरी .. मान लीजिए कि आपका डेटासेट बहुत बड़ा नहीं है!

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

साझा करते हैं तुम क्या कर समाप्त हो गया!

संपादित करें: स्ट्रक्चरफिंडवेल्यू सुझाव दिया गया है कि उत्कृष्ट भी दिखता है, मैंने कोई प्रासंगिक कार्य नहीं देखा।

0

CFGroovy एफटीडब्ल्यू! :)

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

या .. आप एक अधिक जावा शैली पसंद करते हैं (w/बंद ओ)

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

क्या यह समाधान प्रश्न में पोस्ट किए गए मूल एल्गोरिदम से बेहतर है? मैं अभी तक ग्रोवी (या सीएफजीरोवी) पर अच्छी तरह से पढ़ा नहीं गया हूं, लेकिन यह * दिखता है * जैसा कि आपने एक और भाषा में एक ही एल्गोरिदम को फिर से लिखा है। इसके लायक होने के लिए, यह थोड़ा अधिक पठनीय है, और तर्कसंगत रूप से अधिक सुरुचिपूर्ण है ... लेकिन तेजी से होने की संभावना है (शायद) स्लिम-टू-नो, इस पर विचार करने के लिए इसे ग्रोवी को चलाने के लिए खोलना है, और सीएफ में वापस जाना है। मुझे लगता है कि अगर यह ग्रोवी में बहुत तेज़ है तो यह संभव है कि ओवरहेड इसके लायक है, लेकिन मुझे शक है। –

5

सीएफ 10 या Railo 4 में, आप का उपयोग कर सकते हैं:

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

यह दर्ज नहीं किया है, लेकिन यह काम करता है! यदि आप सभी इंडेक्स चाहते हैं तो ArrayFindAll() भी एक विकल्प है।

+0

नए कार्यों का यह वर्ग महान है। – rhinds

संबंधित मुद्दे

 संबंधित मुद्दे