scripting - google - how to find someone's name by phone number for free
केवल एक कुंजी खोज के साथ Scripting.Dictionary लुकअप-ऐड-अगर-मौजूद नहीं है? (2)
मैं एक Scripting.Dictionary
में कुंजी देख रहा हूं। मुझे यह सुनिश्चित करने के लिए कि मैं उन्हें केवल एक बार शब्दकोश (और उनके आइटम) जोड़ता हूं:
If MyDict.Exists (Key) Then ' first internal key-value lookup
Set Entry=MyDict.Item (Key) ' Second internal key->value lookup
else
Set Entry=New ItemType
MyDict.Add Key,Entry
End If
' Now I work on Entry...
Exists
है शब्दकोश में कुंजी को दिखता है, और Item ()
करता है, भी। इसलिए मुझे एक तार्किक लुकअप ऑपरेशन के लिए दो प्रमुख लुकअप मिले। क्या कोई बेहतर तरीका नहीं है?
Item
संपत्ति के लिए डोक्स कहते हैं
"यदि कोई मौजूदा आइटम वापस करने का प्रयास करते समय कुंजी नहीं मिलती है, तो एक नई कुंजी बनाई जाती है और इसके संबंधित आइटम को खाली छोड़ दिया जाता है।" ( एमएसडीएन )
यह सच है, अर्थात् एक गैर-अस्तित्व वाली कुंजी को देखकर स्पष्ट रूप से शब्दकोश के इस महत्वपूर्ण भाग को, संभवतः संबंधित आइटम = खाली के साथ। लेकिन इसके लिए क्या अच्छा है? मैं इसे कैसे एक लुकअप ऑपरेशन के लिए इसे उबालने के लिए इस्तेमाल कर सकता हूं? Item ()
संपत्ति कॉल के दौरान कुंजी बनाने के बाद मैं खाली वस्तु कैसे सेट कर सकता हूँ?
यह कोड और आउटपुट:
>> Set d = CreateObject("Scripting.Dictionary")
>> WScript.Echo 0, d.Count
>> If d.Exists("soon to come") Then : WScript.Echo 1, d.Count : End If
>> WScript.Echo 2, d.Count
>> d("soon to come") = d("soon to come") + 1
>> WScript.Echo 3, d.Count, d("soon to come")
>>
0 0
2 0
3 1 1
दिखाता है:
- बिना किसी मौजूदा कुंजी को खोज रहे हैं। एक्सिस शब्दकोश की कुंजी को जोड़ता नहीं है (.उंट अभी भी # 2 पर है)
- बिना किसी मौजूदा कुंजी को एक्सेस करना IEM या () - मेरे नमूना कोड में असाइनमेंट के दाहिने हाथ की ओर - शब्दकोश में कुंजी / खाली जोड़ी जोड़ता है; कुछ काम (जैसे आवृत्ति गणना) के लिए यह 'काम करता है', क्योंकि रिक्त को 0 के रूप में माना जाता है या स्ट्रिंग कंसैटेननेशन में। ऑब्जेक्ट्स के लिए इस छोटे पैमाने पर ऑटोवॉवीफिकेशन का इस्तेमाल नहीं किया जा सकता (प्रोग्रामर के बारे में सोचने वाले किसी भी वस्तु को रिक्त करने के लिए कोई उचित तरीके से नहीं और वीबीस्क्रिप्ट में पायथन या रूबी के रूप में कोई भी डिफ़ॉल्ट जादू नहीं)
- यदि आपको नामित ऑब्जेक्ट्स का एक डिक्शनरी बनाए रखना है और एक ही समय में नाम और उसके ऑब्जेक्ट का उपयोग कर सकते हैं, तो आप केवल
Set d(name) = object
- d (नाम) लिख सकते हैं यदि आवश्यक हो तो प्रमुख स्लॉट "नाम" सेट असाइनमेंट ऑब्जेक्ट को इसी मान में डाल देगा (रिक्त या 'पुरानी' वस्तु ('पॉइंटर') पर लिखा होना)।
अगर आप वास्तव में क्या हासिल करना चाहते हैं, इसके बारे में कुछ जानकारी जोड़ते हैं, तो मैं इस उत्तर में जोड़ना चाहता हूं।
जोड़ा गया:
यदि आप (तार्किक रूप से) डुप्लिकेट के साथ कुंजी की एक सूची पर काम करते हैं और मक्खी पर डिक्शनरी में नई ऑब्जेक्ट जोड़ना चाहते हैं, तो आप डबल लुकअप से बच नहीं सकते, क्योंकि आपको अस्तित्व (1.0) की जांच करने और (2.0) असाइन करने की आवश्यकता है (शायद नव निर्मित और सौंपा (1.5)) आपके कार्य चर पर ऑब्जेक्ट (देखें / मी: ए या / मी: बी मेरे नमूना कोड में) अन्य भाषाओं में, जो बयान देते हैं, वे मूल्य की अनुमति दे सकते हैं
if ! (oBJ = dicX( key )) {
oBJ = dicX( key ) = new ItemType()
}
oBJ.doSomething()
और वीबीस्क्रिप्ट के सेट बनाम के बिना घृणा को कुछ पसंद करते हैं
oBJ = dicX( key )
If IsEmpty( oBJ ) Then
dicX( key ) = New ItemType
oBJ = dicX( key )
End If
केवल नए तत्वों के लिए अतिरिक्त काम करेंगे, लेकिन यह सब एक पाइप सपना है
अगर उन दोहरी खोजों में वास्तव में कोई मायने रखती है (जो मुझे संदेह है - क्या आप कोई बहस या सबूत दे सकते हैं?), तो आपके कार्यक्रम का समग्र रूप से काम करता है उदाहरण के लिए: यदि आप अपनी कार्य सूची को अनूठा बना सकते हैं, तो सब कुछ सरल हो जाता है (देखें / मी: c मेरे नमूने में)। बेशक, मुझे अब भी पता नहीं है, चाहे आपके विशिष्ट कार्य के लिए ऐसे परिवर्तन संभव हैं।
इसके साथ प्रयोग करने के लिए कोड:
Dim dicX : Set dicX = CreateObject( "Scripting.Dictionary" )
Dim aKeys : aKeys = Split( "1 2 3 4 4 3 2 1 5" )
Dim sMode : sMode = "a"
Dim oWAN : Set OWAN = WScript.Arguments.Named
If oWAN.Exists( "m" ) Then sMode = oWAN( "m" )
Dim sKey, oBJ
Select Case sMode
Case "a"
For Each sKey In aKeys
If Not dicX.Exists( sKey ) Then
Set dicX( sKey ) = New cItemType.init( sKey )
End If
Set oBJ = dicX( sKey )
WScript.Echo oBJ.m_sInfo
Next
Case "b"
For Each sKey In aKeys
If IsEmpty( dicX( sKey ) ) Then
Set dicX( sKey ) = New cItemType.init( sKey )
End If
Set oBJ = dicX( sKey )
WScript.Echo oBJ.m_sInfo
Next
Case "c"
aKeys = uniqueList( aKeys )
For Each sKey In aKeys
Set dicX( sKey ) = New cItemType.init( sKey )
Set oBJ = dicX( sKey )
WScript.Echo oBJ.m_sInfo
Next
Case Else
WScript.Echo "Unknown /m:" & sMode & ", pick one of a, b, c."
End Select
WScript.Echo "----------"
For Each sKey In dicX.Keys
WScript.Echo dicX( sKey ).m_sInfo
Next
Dim g_ITCnt : g_ITCnt = 0
Class cItemType
Public m_sInfo
Public Function init( sKey )
Set init = Me
g_ITCnt = g_ITCnt + 1
m_sInfo = "Obj for " & sKey & " (" & g_ITCnt & ")"
End Function
End Class ' cItemType
Function uniqueList( aX )
Dim dicU : Set dicU = CreateObject( "Scripting.Dictionary" )
Dim vX
For Each vX in aX
dicU( vX ) = Empty
Next
uniqueList = dicU.Keys
End Function
नमूना आउटपुट:
/m:a
Obj for 1 (1)
Obj for 2 (2)
Obj for 3 (3)
Obj for 4 (4)
Obj for 4 (4)
Obj for 3 (3)
Obj for 2 (2)
Obj for 1 (1)
Obj for 5 (5)
----------
Obj for 1 (1)
Obj for 2 (2)
Obj for 3 (3)
Obj for 4 (4)
Obj for 5 (5)
==================================================
xpl.vbs: Erfolgreich beendet. (0) [0.07031 secs]
/m:c
Obj for 1 (1)
Obj for 2 (2)
Obj for 3 (3)
Obj for 4 (4)
Obj for 5 (5)
----------
Obj for 1 (1)
Obj for 2 (2)
Obj for 3 (3)
Obj for 4 (4)
Obj for 5 (5)
================================================
xpl.vbs: Erfolgreich beendet. (0) [0.03906 secs]
टाइमिंग अंतर संभवत: / m: c मोड के कम आउटपुट के कारण होता है, लेकिन यह ज़्यादा ज़्यादा ज़रूरी नहीं कर के महत्व पर जोर देती है
मेरे लिए महत्वपूर्ण समस्या यह है कि VBScript हमें वस्तुओं के साथ Set
का उपयोग करने के लिए मजबूर करता है, और Empty
वस्तु नहीं है एक ऐसी चाल जो मैंने अतीत में इसका उपयोग करने के लिए उपयोग किया है, वह मान के लिए एक अस्थायी प्लेसहोल्डर बनाने के लिए Array
फ़ंक्शन का उपयोग करना है। तो मैं यह देखने के लिए सरणी को देख सकता हूँ कि क्या मान एक ऑब्जेक्ट है या नहीं। आपके उदाहरण के लिए लागू:
tempArr = Array(dict.Item(key))
If IsEmpty(tempArr(0)) Then
' new entry
Set entry = New MyClass
' can't use Add because the key has already been implicitly created
Set dict.Item(key) = entry
Else
' existing entry
Set entry = tempArr(0)
End If
इस मामले में, हालांकि, आपने डबल लुकअप का सफाया नहीं किया है, लेकिन "मौजूदा प्रविष्टि" मामले से इसे "नया एंट्री" केस में स्थानांतरित कर दिया है।