Seite 1 von 3

"Top 3" aus Array ermitteln...

Verfasst: 19.10.2006 16:32
von Hermann
Hallo zusammen....

ich stehe ein wenig auf dem Schlauch....... Anfänger halt.......

Also ... ich habe ein Array mit n Feldern :

DIM variable.s (n)

Diese habe ich mit Werten gefüllt....... zum Teil kommen Einträge (gewollt) mehrfach vor....

Nun möchte ich feststellen welcher Eintrag am häufigsten, 2häufigsten und 3häufigsten vorkommt.........

Hat jemand einen Tipp für mich ?

Danke im voraus...... Hermann

Verfasst: 19.10.2006 16:38
von Konne
Mit

SortArray(ArrayName(), Optionen [, Start, Ende])

sortieren,
und dann mit einem

For

Next

dur alle Elemente gehen.

Nun machst du eine Linked List bei der du immer ein neues Element hinzufügst wenn du was neues gefunden hast.

zB:

Code: Alles auswählen



Structure Egb
  Val.l
  Anzahl.l
EndStructure

NewList Ergeb.Egb()
Dim Vals(100)

For t = 0 To 100
  Vals(t)=Random(9)+1
Next

SortArray(Vals(), 0)


For t = 0 To 100
  If OldVal<>Vals(t)
    OldVal=Vals(t)
    AddElement(Ergeb())
    Ergeb()\Val=Vals(t)      
  EndIf
  
  Ergeb()\Anzahl+1
Next

SortStructuredList(Ergeb(),1,OffsetOf(Egb\Anzahl),#PB_Sort_Long)

ForEach Ergeb()
  Debug "Es gibt "+Str(Ergeb()\Anzahl)+" mal die Nummer "+Str(Ergeb()\Val)+"."
Next


Verfasst: 19.10.2006 16:47
von Kaeru Gaman
soll es in der ursprünglichen reihenfolge bleiben?

was für werte kommen denn vor?

wenn es z.b. nur 100 verschiedene werte gibt, wäre ein kontrollarray die einfachste lösung...

Verfasst: 19.10.2006 16:58
von Hermann
erstmal ein dankeschön an dieser Stelle......

Also.... in den Array kommen diverse Werte ( in diesem Fall Haltestellennamen ) die ich vorher aus einer Datenbank auslese vor.... unsortiert....

Nun will ich feststellen welche 3 Haltestellen am meisten aufgeführt werden...... somit ist der NAme ( alphabetisch ) zur Ausgabe egal..... ich brauche halt nur die 3 häufigsten Werte....

Ich glaube ich muß mich wohl etwas intensiever mit Strukturen etc befassen......... lach......

Verfasst: 19.10.2006 17:05
von Kaeru Gaman
gut.
du kannst jetzt ein zweites array anlegen, in dem du alle namen der reihe nach aufführst.
dabei ist die ordnung egal, aber es muss jeder name genau einmal drinstehn.
ein drittes array machst du numerisch als zählarray.

jetzt gehst du deine komplette liste durch (die ursprüngliche)
bei jedem einzelnen eintrag gehst du das haltestellenverzeichnis (2.Array) durch,
und wenn der name übereinstimmt, erhöhst du der zähler im dritten array.

nachher kannst du direkt aus dem zählarray lesen, wieoft welche haltestelle vorkommt,
und den namen hast du im 2.Array an demselben index.

...das 2te und 3te Array könntest du natürlich auch in ein einziges strukturiertes packen,
wo die struktur aus einem string und einem zähler besteht.
dann kannst du das nachher noch nach zähler sortieren,
um es so in die reihenfolge der häufigkeit zu bringen.

das meinte ich mit kontrollarray, das ist imho die einfachste lösung,
wenn die menge an verschiedenen werten nicht allzu groß ist.

Verfasst: 19.10.2006 17:11
von Hermann
Ich danke erstmal für die Denkanstöße.......... mal sehen ob ich es umsetzen kann...... lach....... wenn nicht nerve ich noch mal...... aber erstmal danke

Verfasst: 24.10.2006 14:45
von Hermann
Ich bin es noch mal......

soweit habe ich es umsetzen können...... hier mal den Quellcode:

Code: Alles auswählen

; in der Variablen "zaehlertaxi" steht die Anzahl der Datensätze aus denen die Top 3 ermittelt werden soll
; in dem Arry "taxi_haltestelle(n)" jeweils ein Name der Haltestelle, dieser NAme kommt z.T. mehrfach vor

  Dim liste.s(zaehlertaxi)
  listenzaehler=1
  For i = 1 To zaehlertaxi
    ja=0
    For ii = 1 To listenzaehler
      If liste.s(ii) = taxi_haltestelle(i)
        ja=1
      EndIf 
    Next
    If ja=0
      liste.s(listenzaehler) = taxi_haltestelle(i)
      listenzaehler = listenzaehler +1
    EndIf
    ii = ii+1
  Next
  listenzaehler=listenzaehler-1
 
  
  Dim liste2(listenzaehler)
  For i = 1 To zaehlertaxi
    For ii = 1 To listenzaehler
      If taxi_haltestelle(i) = liste(ii)
        liste2(ii) = liste2(ii)+1
      EndIf
    Next 
  Next
  

; hier nun das Problem........
; es sollen die 3 häufigsten Haltestellen mit der Anzahl ermittelt werden und den Variablen top1 bis 3 sowie top1s bis 3 zugeteilt werden....

  top1=0
  top1s.s=" "
  top2=0
  top2s.s=" "
  top3=0
  top3s.s=" "
  
  For i = 1 To listenzaehler
    If liste2(i) > top1
      top1=liste2(i)
      top1s=taxi_haltestelle(i)
    EndIf
  Next
  For i = 1 To listenzaehler
    If liste2(i) > top2 And liste2(i)<top1
      top2=liste2(i)
      top2s=taxi_haltestelle(i)
    EndIf
  Next
  For i = 1 To listenzaehler
    If liste2(i) > top3 And liste2(i)<top2
      top3=liste2(i)
      top3s=taxi_haltestelle(i)
    EndIf
  Next
  MessageRequester("test",top1s.s+"    "+Str(top1))
  MessageRequester("test",top2s.s+"    "+Str(top2))
  MessageRequester("test",top3s.s+"    "+Str(top3))
  

Bitte........ erschlagt mich nicht wegen unsauberer Programierung..... lächel........

Das Problem ist nun folgendes.......
bei obrigem Beispiel werden Haltestellen die gleich oft vorkommen unterschlagen....... es findet also keine reale Top 3 Auswertung statt.....

Jemand eine Idee ??

Danke im voraus

Verfasst: 24.10.2006 14:49
von Konne
Code tut net wegen dem nicht dimensioierten array.
Wenn du einen code postest er tu hilft man dir auch gernener ;)

Verfasst: 24.10.2006 14:59
von Hermann
Esrt mal danke für die Antwort......... wenn ich nicht wüßte das der Code funktoniert würde mir deine Antwort echt hilfreich sein............ lächel.......

Er ist ein Auszug aus dem gesamten Code......... ich glaube das ich alles relevante reingeschrieben habe ...... ich will ja auch keine fertige Lösung sondern nur einen Lösungsansatz....... und........ es geht sich heirbei um die Sortierung in die Top3........

Trotzdem Danke......... ich erkenne den guten Willen.... lächel

Verfasst: 24.10.2006 15:11
von Tafkadasom2k5
Hey-> pimp your Selbstvertrauen, nutze Smileys und Absätze- und schweige nicht so schüchtern mit den Punkten vor dich hin <) :allright:

Und nerven tust du bestimmt nicht- wir freuen uns immer über Leute, die sich mit Programmierung beschäftigen.
In dem Sinne- mach weiter so, und sry, dass ich mich gerade nicht deines Problemes annehmen kann, da Zeitmangel..

Ich wollte das nur mal gesagt haben...

Gr33tz
Tafkadasom2k5