ভিবিএতে হ্যাশ টেবিল / সহযোগী অ্যারে


90

ভিবিএতে হ্যাশ টেবিল বা এসোসিয়েটিভ অ্যারে কীভাবে তৈরি করা যায় তা ব্যাখ্যা করার জন্য আমি নথির সন্ধান পাই না। এটা কি সম্ভব?

আপনি কি কোনও নিবন্ধের সাথে লিঙ্ক করতে পারেন বা আরও ভাল কোড পোস্ট করতে পারেন?



উত্তর:


112

আমার মনে হয় আপনি মাইক্রোসফ্ট স্ক্রিপ্টিং রানটাইম লাইব্রেরিতে পাওয়া অভিধানের সন্ধান করছেন। (সরঞ্জামগুলির থেকে আপনার প্রকল্পের একটি রেফারেন্স যুক্ত করুন ... ভিবিইতে রেফারেন্স মেনু)

এটি ভেরিয়েন্টের সাথে মানিয়ে নিতে পারে এমন কোনও সাধারণ মানের সাথে কাজ করে (কীগুলি অ্যারে হতে পারে না, এবং সেগুলিকে বস্তু তৈরি করার চেষ্টা করা কোনও অর্থবোধ করে না below নীচের @ নাইলের মন্তব্য দেখুন)):

Dim d As dictionary
Set d = New dictionary

d("x") = 42
d(42) = "forty-two"
d(CVErr(xlErrValue)) = "Excel #VALUE!"
Set d(101) = New Collection

আপনার প্রয়োজনীয়তা আরও সহজ এবং আপনি কেবল স্ট্রিং কীগুলি চাইলে আপনি ভিবিএ সংগ্রহ অবজেক্টটিও ব্যবহার করতে পারেন।

আমি জানি না হয় আসলে কিছু আছে কি না, সুতরাং আপনার যদি হ্যাশ টেবিলের মতো পারফরম্যান্সের প্রয়োজন হয় তবে আপনি আরও খনন করতে পারেন। (সম্পাদনা: স্ক্রিপ্টিং। ডিকোরিয়ালিটি অভ্যন্তরীণভাবে একটি হ্যাশ টেবিল ব্যবহার করে )


হ্যাঁ - অভিধানটি উত্তর। আমি এই সাইটেও উত্তর খুঁজে পেয়েছি। stackoverflow.com/questions/915317/...
user158017

4
এটি বেশ ভাল উত্তর: তবে কীগুলি কখনই বস্তু হয় না - আসলে কী হচ্ছে তা হ'ল অবজেক্টের ডিফল্ট সম্পত্তিটি স্ট্রিং হিসাবে কাস্ট করা হচ্ছে এবং কী হিসাবে ব্যবহৃত হচ্ছে। যদি অবজেক্টটির কোনও ডিফল্ট সম্পত্তি (সাধারণত 'নাম') সংজ্ঞায়িত না হয় তবে এটি কাজ করবে না।
নাইজেল হেফারনন

@ নীল, ধন্যবাদ আমি দেখতে পাচ্ছি যে আপনি সত্যই সঠিক এছাড়া মনে হলে বস্তুর কোনো ডিফল্ট সম্পত্তি আছে, তারপর সংশ্লিষ্ট অভিধান চাবিকাঠি মত Empty। আমি সেই অনুযায়ী উত্তর সম্পাদনা করেছি।
jtolle

বেশ কিছু ডেটা-স্ট্রাকচার এখানে- ব্যাখ্যা analystcave.com/... এই পোস্টটি দেখায় কিভাবে মধ্যে এক্সেল VBA- পরবর্তী পারে hashtables ব্যবহার করতে stackoverflow.com/questions/8677949/...
কেন জনি

উপরে লিঙ্ক টাইপ:। নেট, না।
জননী কেন


7

অভিধান অবজেক্ট বা সংগ্রহ অবজেক্টটি ব্যবহার করে দেখুন।

http://visualbasic.ittoolbox.com/documents/d অভিধান-object-vs-collection-object-12196


4
প্রদত্ত লিঙ্কটি আর কাজ করে না। মূল পোস্টিংয়ের মুহুর্তে সামগ্রীটি এখানে দেখতে পাওয়া যাবে: web.archive.org/web/20090729034340/http://…
পল ভ্যান লিউউয়েন

6

এখানে আমরা যাচ্ছি ... কেবলমাত্র কোনও মডিউলটিতে কোডটি অনুলিপি করুন, এটি ব্যবহারের জন্য প্রস্তুত

Private Type hashtable
    key As Variant
    value As Variant
End Type

Private GetErrMsg As String

Private Function CreateHashTable(htable() As hashtable) As Boolean
    GetErrMsg = ""
    On Error GoTo CreateErr
        ReDim htable(0)
        CreateHashTable = True
    Exit Function

CreateErr:
    CreateHashTable = False
    GetErrMsg = Err.Description
End Function

Private Function AddValue(htable() As hashtable, key As Variant, value As Variant) As Long
    GetErrMsg = ""
    On Error GoTo AddErr
        Dim idx As Long
        idx = UBound(htable) + 1

        Dim htVal As hashtable
        htVal.key = key
        htVal.value = value

        Dim i As Long
        For i = 1 To UBound(htable)
            If htable(i).key = key Then Err.Raise 9999, , "Key [" & CStr(key) & "] is not unique"
        Next i

        ReDim Preserve htable(idx)

        htable(idx) = htVal
        AddValue = idx
    Exit Function

AddErr:
    AddValue = 0
    GetErrMsg = Err.Description
End Function

Private Function RemoveValue(htable() As hashtable, key As Variant) As Boolean
    GetErrMsg = ""
    On Error GoTo RemoveErr

        Dim i As Long, idx As Long
        Dim htTemp() As hashtable
        idx = 0

        For i = 1 To UBound(htable)
            If htable(i).key <> key And IsEmpty(htable(i).key) = False Then
                ReDim Preserve htTemp(idx)
                AddValue htTemp, htable(i).key, htable(i).value
                idx = idx + 1
            End If
        Next i

        If UBound(htable) = UBound(htTemp) Then Err.Raise 9998, , "Key [" & CStr(key) & "] not found"

        htable = htTemp
        RemoveValue = True
    Exit Function

RemoveErr:
    RemoveValue = False
    GetErrMsg = Err.Description
End Function

Private Function GetValue(htable() As hashtable, key As Variant) As Variant
    GetErrMsg = ""
    On Error GoTo GetValueErr
        Dim found As Boolean
        found = False

        For i = 1 To UBound(htable)
            If htable(i).key = key And IsEmpty(htable(i).key) = False Then
                GetValue = htable(i).value
                Exit Function
            End If
        Next i
        Err.Raise 9997, , "Key [" & CStr(key) & "] not found"

    Exit Function

GetValueErr:
    GetValue = ""
    GetErrMsg = Err.Description
End Function

Private Function GetValueCount(htable() As hashtable) As Long
    GetErrMsg = ""
    On Error GoTo GetValueCountErr
        GetValueCount = UBound(htable)
    Exit Function

GetValueCountErr:
    GetValueCount = 0
    GetErrMsg = Err.Description
End Function

আপনার ভিবি (এ) অ্যাপে ব্যবহার করতে:

Public Sub Test()
    Dim hashtbl() As hashtable
    Debug.Print "Create Hashtable: " & CreateHashTable(hashtbl)
    Debug.Print ""
    Debug.Print "ID Test   Add V1: " & AddValue(hashtbl, "Hallo_0", "Testwert 0")
    Debug.Print "ID Test   Add V2: " & AddValue(hashtbl, "Hallo_0", "Testwert 0")
    Debug.Print "ID Test 1 Add V1: " & AddValue(hashtbl, "Hallo.1", "Testwert 1")
    Debug.Print "ID Test 2 Add V1: " & AddValue(hashtbl, "Hallo-2", "Testwert 2")
    Debug.Print "ID Test 3 Add V1: " & AddValue(hashtbl, "Hallo 3", "Testwert 3")
    Debug.Print ""
    Debug.Print "Test 1 Removed V1: " & RemoveValue(hashtbl, "Hallo_1")
    Debug.Print "Test 1 Removed V2: " & RemoveValue(hashtbl, "Hallo_1")
    Debug.Print "Test 2 Removed V1: " & RemoveValue(hashtbl, "Hallo-2")
    Debug.Print ""
    Debug.Print "Value Test 3: " & CStr(GetValue(hashtbl, "Hallo 3"))
    Debug.Print "Value Test 1: " & CStr(GetValue(hashtbl, "Hallo_1"))
    Debug.Print ""
    Debug.Print "Hashtable Content:"

    For i = 1 To UBound(hashtbl)
        Debug.Print CStr(i) & ": " & CStr(hashtbl(i).key) & " - " & CStr(hashtbl(i).value)
    Next i

    Debug.Print ""
    Debug.Print "Count: " & CStr(GetValueCount(hashtbl))
End Sub

18
আমি কোনও ব্র্যান্ডের নতুন ব্যবহারকারীকে কোড পোস্ট করার উদ্দেশ্যে কমে যাচ্ছি না, তবে সাধারণত কোনও কিছুকে "হ্যাশ টেবিল" বললে বোঝা যায় যে অন্তর্নিহিত বাস্তবায়ন আসলে হ্যাশ টেবিল! আপনার এখানে যা আছে তা হ'ল একটি নিয়মিত অ্যারে এবং লিনিয়ার অনুসন্ধানের সাহায্যে প্রয়োগ করা একটি অ্যা্যাসোসিয়েটিভ অ্যারে। : এখানে পার্থক্য দেখুন en.wikipedia.org/wiki/Hash_table
jtolle

7
প্রকৃতপক্ষে. একটি হ্যাশ টেবিলের বিন্দুটি মূল হ'ল 'হ্যাশিং' হ'ল অন্তর্নিহিত স্টোরেজটিতে (বা কমপক্ষে পর্যাপ্ত কাছাকাছি, ডুপ্লিকেট কীগুলির ক্ষেত্রে অনুমোদিত) এর মানটির অবস্থান নিয়ে যায়, ফলে সম্ভাব্য ব্যয়বহুল অনুসন্ধানের প্রয়োজনীয়তা অপসারণ করে।
Cor_Blimey

4
বৃহত্তর হ্যাশ টেবিলের জন্য উপায় খুব ধীর। 17,000 এন্ট্রি যুক্ত করতে 15 সেকেন্ডের বেশি সময় লাগে। আমি অভিধান ব্যবহার করে 6 সেকেন্ডের নিচে 500,000 যুক্ত করতে পারি। এমএসসিআরলিব হ্যাশটেবল ব্যবহার করে 3 সেকেন্ডেরও কম সময়ে 500,000।
ক্রিস্টোফার থমাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.