Hot News:

Unser Angebot:

  Foren auf CAD.de (alle Foren)
  Inventor VBA
  In einem Array suchen

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte
Autor Thema:  In einem Array suchen (7716 mal gelesen)
Cookiie
Mitglied



Sehen Sie sich das Profil von Cookiie an!   Senden Sie eine Private Message an Cookiie  Schreiben Sie einen Gästebucheintrag für Cookiie

Beiträge: 32
Registriert: 20.06.2005

erstellt am: 11. Jul. 2005 11:42    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hi Leute,

ich habe ein Array mit über 3600 werten darin. Und möchte nun direkt auf ein Element zugreifen können, ohne das Ganze Array mit einer Schleife durchforsten zu müssen.
Es würde auch gehen wenn ich den Index, wo der Wert gespeichert ist zurückgeliefert bekomme.
Hintergrund ist eine Bauteilliste die ich durchsuche um den richtigen wert zu finden, bei ner Leiterplatte mit 2000 Bauelementen entsprechend 2000 x 3600 Schleifendurchgänge, was sehr zeitintensiv ist. Ein Direktzugriff würde dies ziemlich beschleunigen.

Gruß Cookiie

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

startrek
Mitglied
Architekt


Sehen Sie sich das Profil von startrek an!   Senden Sie eine Private Message an startrek  Schreiben Sie einen Gästebucheintrag für startrek

Beiträge: 1361
Registriert: 13.02.2003

Veni, Vidi, VW ...
I came, I saw, I drove around in a little car.

erstellt am: 11. Jul. 2005 13:19    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Cookiie 10 Unities + Antwort hilfreich

Hi Cookie,

fürchte mit 'normalen' Arrays haste da schlechte Karten, bleibt IMHOIn my humble oppinion (Meiner Meinung nach) nur die Schleife.
Prüfen, ob ein Wert überhaupt vorkommt kannst evtl. mit Filter(), also so in etwa:

If UBound(Filter(deinArr, "deinWert")) = -1 Then MsgBox "not exists"

Ansonsten bleiben Collections oder Dictionary als Alternative;-)

Code:

Sub test()
  Dim mydic As New Scripting.Dictionary

  mydic.Add "key1", "one"
  mydic.Add "key2", "two"
  mydic.Add "key3", "three"

  Debug.Print mydic("key1"), mydic.Items(2), mydic.Keys(0)

  mydic("key1") = "wasanderes"
 
  Debug.Print mydic("key1")

End Sub



lg Nancy     

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Cookiie
Mitglied



Sehen Sie sich das Profil von Cookiie an!   Senden Sie eine Private Message an Cookiie  Schreiben Sie einen Gästebucheintrag für Cookiie

Beiträge: 32
Registriert: 20.06.2005

erstellt am: 11. Jul. 2005 14:00    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hm, hab ich fast befürchtet.
Das mit den Collections, da müßte ich mein ganzes Programm jetzt umschreiben und das wäre doof, zumal das jetzige läuft und voll funktional ist.
Wäre ja nur aus Performance gründen nett. Hab ja eh schon nen Schleifenabbruch drin wenn ers gefunden hat, was das ganze schonmal reduziert.
Aber habs mal gemessen, bei 2000 Teilen braucht er knapp 1:42min. Was eigentlich noch schnell genug ist. Will bloß nicht wissen wie lange der auf ner älteren Machine braucht ^^.
Aber trotzdem danke.

Gruß Cookiie

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

startrek
Mitglied
Architekt


Sehen Sie sich das Profil von startrek an!   Senden Sie eine Private Message an startrek  Schreiben Sie einen Gästebucheintrag für startrek

Beiträge: 1361
Registriert: 13.02.2003

Veni, Vidi, VW ...
I came, I saw, I drove around in a little car.

erstellt am: 11. Jul. 2005 16:52    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Cookiie 10 Unities + Antwort hilfreich

... quick'n dirty noch, allerdings je quick desto dirty 
Code:

Sub asdf()
   Dim src, a, b, x, y
   x = 3: y = "blabla"
   src = Array(1, 2, 3, 1, 2)
   a = Filter(src, x): b = Filter(src, x, 0)
   If Not CBool(UBound(a)) Then
      ReDim Preserve b(LBound(b) To UBound(b) + 1)
      b(UBound(b)) = y: src = b
   Else: MsgBox "matches <> 1"
   End If
End Sub

lg Nancy 

[Diese Nachricht wurde von startrek am 11. Jul. 2005 editiert.]

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Cookiie
Mitglied



Sehen Sie sich das Profil von Cookiie an!   Senden Sie eine Private Message an Cookiie  Schreiben Sie einen Gästebucheintrag für Cookiie

Beiträge: 32
Registriert: 20.06.2005

erstellt am: 12. Jul. 2005 14:33    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Du bist aber ein pöses Mädchen ;-).

Hab jetzt einfach ne Abart der binären Suche implementiert.

Code:

Sub BinaereSuche(wert As Variant, arr As Variant)

    Dim i As Integer, k As Integer
    Dim schleifen As Integer
    Dim gefunden As Boolean, ende As Boolean
    Dim grenze

    gefunden = False
    schleifen = 0
   
    i = (UBound(arr, 2) + 1) / 2
    k = i
    Do Until ende
        k = k / 2 + k Mod 2
        If wert < arr(0, i) Then
            i = i - k
        Else
            i = i + k
        End If
        schleifen = schleifen + 1
        If wert = arr(0, i) Then
            gefunden = True
            ende = True
        End If
        grenze = Log((UBound(arr, 2) + 1)) / Log(2)
        If schleifen > grenze Then
            ende = True
        End If
    Loop
   
    If gefunden Then
        MsgBox arr(1, i)
    Else
        MsgBox "Wert nicht vorhanden."
    End If
End Sub


Das ganze benötigt einen Suchwert und ein vorsortiertes Array, sonst funktioniert es nicht. Ist aber aufgrund der logarithmisches Suche sehr schnell.

Gruß Cookiie, nicht ganu so quick aber trotzdem dirty ^^

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2023 CAD.de | Impressum | Datenschutz