Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[VB6] Uniekheid bepalen van een string in een array

Pagina: 1
Acties:
  • 309 views sinds 30-01-2008
  • Reageer

  • Onoffon
  • Registratie: April 2006
  • Laatst online: 29-11 23:37
Hallo,

Ik ben bezig met een programma waarmee je je eigen bankrekening kan analyseren, en om bijvoorbeeld een trendanalyse te doen op je vaste lasten, enz.. enz...

Nu wil ik voor de GUI een drop down box maken, waarin je kan kiezen uit alle unieke eigenschappen van die bepaalde string, bijvoorbeeld ik heb 600 transacties waar 30 unieke tegenrekeningen in voorkomen, nu wil ik dus in die dropdown box die 30 rekeningen hebben, en dus niet de totale 600 tegenrekeningen in die dropdown.

En hier loop ik vast, ik heb wel een idee hoe het kan, maar dan krijg ik een overflow, niet echt efficient dus.

Visual Basic .NET:
1
2
3
4
5
6
7
8
9
For a = o To aantal_transacties
    combo_welke = aantal_transacties - a
    For b = 0 To aantal_transacties
        If orig_tegenrekening_naam(combo_welke) <> orig_tegenrekening_naam(b) Then
            Form1.Combo2(2).List(combo_pos_naam) = orig_tegenrekening_naam(combo_welke)
            combo_pos_naam = combo_pos_naam + 1
        End If
    Next b
Next a


Uitleg:

aantal_transacties = 600
combo_welke = begint vanaf pos 600 naar 0 (dit omdat de output van de rabobank database begint met de oudste transactie als eerst)
a = loopt 1 voor 1 de tegenrekeningen af
b = loopt 1 voor 1 de tegenrekeningen af
Form1.Combo2(2).List(combo_pos_naam) = Toevoeging op de combo mits a en b niet overeenkomen
combo_pos_naam = positie op de combo

Ik heb dus 600*600 if-thens(360000) vergelijkingen, en dit is nog maar 1 veld van de transacties (er zijn in totaal 17 velden per transactie).
Misschien om de code wat duidelijker te maken:

Loop 1 voor 1 de 600 transacties bij langs, controleer bij elke transactie of deze overeenkomt met 1 van deze 600 transacties, zo ja, zet deze dan in een dropdown box

Wie kan mij op weg helpen om efficienter te controleren dat een string in een array uniek is, en dit vervolgens bij elke string in die array controleert?

P.S. Bijgevoegde code is maar een voorbeeld, let dus niet op de benamingen

[ Voor 5% gewijzigd door Onoffon op 26-11-2007 00:28 . Reden: uniek toegevoegd bij de 30 tegenrekeningen ]

Just a simple thought....


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Ik zou de transacties in een dictionary gooien (die kent VB6 geloof ik native, en anders met een simpele createobject), dan scheelt al een boel lookups. Een andere manier is je arrays sorteren en met een simpele binary search er in zoeken. Een andere optie is natuurlijk gematchte transacties uit de array (collection) verwijderen, zo krijg je steeds minder transacties om te vergelijken.

Maar ik geloof dat ik je probleem nog steeds niet helemaal snap; want je hebt het over 30 rekeningen, maar 600x600 transacties?

[ Voor 9% gewijzigd door RobIII op 26-11-2007 00:07 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Onoffon
  • Registratie: April 2006
  • Laatst online: 29-11 23:37
Stel: er zijn 600 transacties (dus ook 600 rekeningnummers), maar in deze 600 rekeningnummers komen maar 30 unieke rekening nummers in voor, om te bepalen welke allemaal uniek zijn moet ik dus 600*600 vergelijkingen maken (tenzij zoals je zegt de gematchte transacties uit de array te verwijderen).
Mijn idee was ook al om iets met sorteren te doen, misschien met een quicksort?

Ik had al zoiets in gedachten om de vergelijking te maken tijdens het vullen van de database te samen met het verwijderen van de gematchte transacties, maar toen bedacht ik me, dat de database natuurlijk wel helemaal gevuld moet zijn, voordat ik de vergelijking kan maken!

edit:
Net even gegoogled op dictionary en vb6, en welke link kom ik als eerst tegen? hhmm.... 8)7

[ Voor 51% gewijzigd door Onoffon op 26-11-2007 00:29 ]

Just a simple thought....


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
SilentTears schreef op maandag 26 november 2007 @ 00:17:
edit:
Net even gegoogled op dictionary en vb6, en welke link kom ik als eerst tegen? hhmm.... 8)7
offtopic:
Waarom zet je in hemelsnaam je zoekwoorden tussen quotes?
Overigens gebruik ik zelf altijd google.com (en een language filter op EN, NL en DE); daar heb ik meer/vaker succes mee dan met google.nl. Je ziet nu dus duidelijk dat de resultaten verschillen omdat de g.nl meer 'waarde' hecht aan NL content, terwijl documentatie en discussies etc. toch vaak EN zijn

[ Voor 30% gewijzigd door RobIII op 26-11-2007 00:33 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Onoffon
  • Registratie: April 2006
  • Laatst online: 29-11 23:37
offtopic:
haha, ja die quotes is een vervelende eigenschap, moet ik toch eens afleren....

Just a simple thought....


  • giMoz
  • Registratie: Augustus 2002
  • Laatst online: 27-11 14:05

giMoz

iets met meester...

Doe het eens de andere kant op.
De eerste kan altijd blijven staan.
De tweede hoef je alleen maar te vergelijken met de eerste, zijn die gelijk dan weg, anders blijven.
De derde hoef je alleen maar te vergelijken met de eerste en (een evt aanwezige) tweede.
De vierde hoef je dus maar te vergelijken met max 3 stuks.
Als er maar 30 unieke inzitten hoef je dus maximaal met 30 stux
lijkt me een stuk sneller al :)

Of niet natuurlijk...


  • YopY
  • Registratie: September 2003
  • Laatst online: 06-11 13:47
Hrm, je zou hiervoor een map kunnen gebruiken (een map is een soort van array object met een object als key). Je gaat door de array, vraagt het item in de map op met de huidige string als key, en als die er al in zit ga je naar de volgende iteratie. Als 'ie er nog niet in zit, zet je hem in de map. En aan het einde converteer je de map naar een lijst met strings (oid).

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public String[] group(String[] items) {
  
  Map map = new Map();
  
  // itereer door strings
  for (String str : items) {
   
    // zoek naar huidige string in de map
    String item = map.get(str);
   
    // als er niets gevonden wordt, zet huidige string in map.
    if (item == null) {
      map.put(str, str);
    }

  }
}


Je zou denken dat een Map ook gewoon door zijn interne lijst met objecten itereert, maar in een praktijktestje waar ik het opzoeken van een object met een string als key in een map vergeleek met het 'handmatig' zoeken door door een lijst te itereren en alle keys te vergelijken, blijkt dat een map vele malen sneller was (15 ms tegenover 30 seconden ofzo).

Nu was dit wel in Java, maar ik denk wel dat het in VB ook wel sneller is - intern gebruikt de map waarschijnlijk een veel snellere methode.

  • BalusC
  • Registratie: Oktober 2000
  • Niet online

BalusC

Carpe diem

offtopic:
Waarom een map met key==value en geen Set of List? Daarmee kun je ook zoeken op aanwezigheid van de waarde met Collection#contains(). Je had anders ook Map#containsKey() kunnen gebruiken. Verder biedt de Collection de retainAll() methode die de overeenkomsten tussen 2 collecties retourneert.

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 00:17
Het is alleen jammer dat de TS met VB6 werkt en jullie VB.Net gebruiken.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • Onoffon
  • Registratie: April 2006
  • Laatst online: 29-11 23:37
Ik heb al een grove fout in mijn denkwijze te pakken, ik moet natuurlijk niet per string 600 keer een vergelijking maken, maar een vergelijking maken met de array waarin alle unieke velden staan.

Dus:

Als array(600) <> aan unieke_array(30) dan toevoegen, anders niks doen.

In mijn topicstart zeg ik 'uniek', maar eigenlijk is dat dus niet zo, eigenlijk gaat het om rekeningnummers die juist meerdere keren voorkomen. Stel ik heb 100 transacties onderverdeeld in 10 rekeningnummers, bij elk rekeningnummer horen dus 10 transacties, zo bedoel ik het, ik heb het een beetje krom uitgelegd lees ik nu. Maar voor de vergelijking die ik moet maken kun je het zien als 'uniek', het is nu nog niet van belang hoe vaak deze voorkomt, dit kan ik met een andere vergelijking wel rechttrekken.
giMoz schreef op maandag 26 november 2007 @ 08:34:
Doe het eens de andere kant op.
De eerste kan altijd blijven staan.
De tweede hoef je alleen maar te vergelijken met de eerste, zijn die gelijk dan weg, anders blijven.
De derde hoef je alleen maar te vergelijken met de eerste en (een evt aanwezige) tweede.
De vierde hoef je dus maar te vergelijken met max 3 stuks.
Als er maar 30 unieke inzitten hoef je dus maximaal met 30 stux
lijkt me een stuk sneller al :)
Zoals giMoz zegt dus, ga het vanavond even proberen of ik er uit kom

Just a simple thought....


  • __fred__
  • Registratie: November 2001
  • Laatst online: 29-11 20:34
SilentTears schreef op zondag 25 november 2007 @ 23:44:


En hier loop ik vast, ik heb wel een idee hoe het kan, maar dan krijg ik een overflow, niet echt efficient dus.

Visual Basic .NET:
1
2
3
4
5
6
7
8
9
For a = o To aantal_transacties
    combo_welke = aantal_transacties - a
    For b = 0 To aantal_transacties
        If orig_tegenrekening_naam(combo_welke) <> orig_tegenrekening_naam(b) Then
            Form1.Combo2(2).List(combo_pos_naam) = orig_tegenrekening_naam(combo_welke)
            combo_pos_naam = combo_pos_naam + 1
        End If
    Next b
Next a
Denk je er ook even aan dat arrays op 1 beginnen in VB6. Dus for a = 1 To aantal.
In VB.NET zou het dan altijd nog for a = 0 To aantal -1 zijn.

Daar komt je overflow vandaan.

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
__fred__ schreef op maandag 26 november 2007 @ 18:18:
[...]


Denk je er ook even aan dat arrays op 1 beginnen in VB6. Dus for a = 1 To aantal.
Dat is maar helemaal de vraag; by default beginnen arrays op 0 en collections op 1. En dan heb je nog option base.
Visual Basic:
1
2
3
4
5
6
7
8
    Dim Col As New Collection
    Dim Arr(5) As String
    
    Arr(0) = "Test"
    MsgBox Arr(0)
    
    Col.Add ("Test")
    MsgBox Col(1)

[ Voor 28% gewijzigd door RobIII op 26-11-2007 22:24 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Kleintje81
  • Registratie: Oktober 2002
  • Laatst online: 20-11 19:32

Kleintje81

Blaat

Gebruik je niet VB6 in microsoft Access?
Anders zou je dit met een SELECT DISTINCT query kunnen oplossen...

BF2 stats Systemen


  • Jewest
  • Registratie: Juni 2007
  • Laatst online: 28-11 11:54
ff snel uit mijn hoofd.

for lcounter = 0 to aantal_rekeningen
if not checkExistBinairelist(inhoud(lcounter)) then
additemtoSortedList inhoud(lcounter)
end if
next lcounter

addListToBox

de rest kun je zelf wel verzinnen..;)

Flickr
Canon 7D + Glas + Licht
Komt het rot over dan bedoel ik het anders en taalfouten zijn inbegrepen.


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Kleintje81 schreef op dinsdag 27 november 2007 @ 14:30:
Gebruik je niet VB6 in microsoft Access?
In MSOffice producten wordt VBA gebruikt (Visual Basic for Applications, een soort 'subset' van VB6)
Kleintje81 schreef op dinsdag 27 november 2007 @ 14:30:
Anders zou je dit met een SELECT DISTINCT query kunnen oplossen...
Dat is een query en heeft dan weer niks van doen met eender welke VB :P

[ Voor 11% gewijzigd door RobIII op 27-11-2007 14:53 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • __fred__
  • Registratie: November 2001
  • Laatst online: 29-11 20:34
RobIII schreef op maandag 26 november 2007 @ 22:17:
[...]

Dat is maar helemaal de vraag; by default beginnen arrays op 0 en collections op 1. En dan heb je nog option base.
Visual Basic:
1
2
3
4
5
6
7
8
    Dim Col As New Collection
    Dim Arr(5) As String
    
    Arr(0) = "Test"
    MsgBox Arr(0)
    
    Col.Add ("Test")
    MsgBox Col(1)
Point taken ;-) Maar van 0 t/m aantal is in elke taal out of bounds.
Pagina: 1